英語版
このページの英語版を見る
文字列ミックスイン
文字列ミックスイン("テンプレートミックスイン"と混同しないこと)は、 文字列定数を通常のDコードとしてコンパイルし、 プログラムに挿入することを可能にする。 文字列のコンパイル時の操作と組み合わせることで、 ドメイン固有言語の作成が可能になる。
例えば、以下では、 名前付きのメンバを持つ構造体を生成するテンプレートを作成できる。
template GenStruct(string Name, string M1) { const char[] GenStruct = "struct " ~ Name ~ "{ int " ~ M1 ~ "; }"; } mixin(GenStruct!("Foo", "bar"));
以下のような構造体を生成する。
struct Foo { int bar; }
表面的には、Dミックスインはテキストを操作し、結果をコンパイルできるため、 Cプリプロセッサと類似した特性がある。 しかし、根本的な大きな違いがある。
- Cのプリプロセッシングは、語彙解析の前に実行される。 これにより、 すべての#includeファイル、パス、および関連するコンパイラスイッチを含むすべてのコンテキストにアクセスできないと、 Cの字句解析や構文解析が不可能になる。 ミックスインは意味解析中に実行され、 字句解析や構文解析プロセスには影響しない。 字句解析や構文解析は、意味解析なしでも実行できる。
- Cプリプロセッサを使用すると、異なる構文のように見えるものを生成できる。
#define BEGIN { #define END } BEGIN int x = 3; foo(x); END
ミックスインでは、このようなことは不可能である。 混合されたテキストは、完全な宣言、 文、または式を形成しなければならない。 - Cマクロは、それがネストされたスコープ内にあっても、同じ名前を持つその後に続くすべてに影響を与える。 Cマクロはすべてのスコープを横断する。 この問題は「コーディングの衛生性」に欠けるとされる。 ミックスインは通常のスコープのルールに従い、 衛生的である。
- C プリプロセッシング式は、 C 言語とは異なる構文と意味論のルールに従う。 C プリプロセッサは、厳密には別の言語である。 ミックスインは同じ言語である。
- Cのconst宣言およびC++のテンプレートは、 Cプリプロセッサでは不可視である。 ミックスインは、テンプレートおよびconst宣言を使用して操作できる。
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.109.1
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku