萌えハッカーニュースリーダー

2025/04/27 17:42 Macros in the Dart Programming Language

出典: https://github.com/dart-lang/language/blob/main/working/macros/feature-specification.md
hakase
博士

ロボ子、Dartにマクロが導入されるって話、知ってるかのじゃ?コンパイル時にプログラムを修正するコードのことじゃ。

roboko
ロボ子

マクロですか、博士。それはすごいですね!具体的にはどのようなことができるようになるのでしょう?

hakase
博士

マクロは、適用された宣言を調査して、コードを生成したり修正したりできるのじゃ。既存のコード生成ツールみたいなものだと思えば良いぞ。

roboko
ロボ子

なるほど。マクロはどのように定義されるのですか?

hakase
博士

ユーザー定義のDartクラスとして実装されて、組み込みマクロインターフェースを実装するのじゃ。個別の「マクロ言語」ではなく、普通のDartコードで書けるのがミソじゃな。

roboko
ロボ子

通常のDartコードで書けるのは便利ですね。マクロはプログラムの構造をどのように調査するのですか?

hakase
博士

イントロスペクションという機能を使うのじゃ。マクロは、クラスの名前やスーパークラス、メンバーなどを調査できるぞ。

roboko
ロボ子

イントロスペクションですか。型が省略されている場合はどうなるのでしょう?

hakase
博士

`OmittedTypeAnnotation`が使われるのじゃ。これは、型推論が必要な場合に、後続のフェーズで型を推論するために使われるぞ。

roboko
ロボ子

なるほど。マクロの適用順序はどのように決まるのですか?

hakase
博士

基本的にはユーザーが制御できる場合とそうでない場合があるのじゃ。順序が重要な場合は、ユーザーが制御できるぞ。メンバーに適用されたマクロは、周囲の型に対するマクロよりも前に適用されるのじゃ。

roboko
ロボ子

マクロはフェーズで実行されるとのことですが、フェーズとは具体的に何をするものなのでしょう?

hakase
博士

フェーズは3つあるのじゃ。型、宣言、定義のフェーズじゃ。早いフェーズは新しい型と宣言を追加して、遅いフェーズはそれらを埋めるのじゃ。

roboko
ロボ子

各フェーズでマクロがアクセスできるのは、すでに完了しているプログラムの部分だけなのですね。

hakase
博士

その通りじゃ。マクロは、`macro`キーワードで始まる特殊な型のクラスとして宣言されるぞ。すべてのマクロコンストラクタはconstとしてマークする必要があるのじゃ。

roboko
ロボ子

マクロは、メタデータアノテーションを読み取る必要があるとのことですが、どのように行うのですか?

hakase
博士

アノテーション可能なすべての宣言には、`Iterable<MetadataAnnotation> get metadata`ゲッターがあるのじゃ。そして、すべての`MetadataAnnotation`オブジェクトには、アノテーションを`Code`オブジェクトとして提供する`Code get code`ゲッターがあるぞ。

roboko
ロボ子

マクロは、新しいコードを宣言にアタッチすることでコードを生成するのですね。

hakase
博士

そうじゃ。マクロに与えられたビルダーオブジェクトのメソッドを呼び出すのじゃ。コード自体は、特殊な`Code`クラス(またはそのサブクラスの1つ)のインスタンスじゃ。

roboko
ロボ子

マクロは、別のマクロのコードをインスタンス化して直接実行することもできるのですね。

hakase
博士

その通りじゃ。マクロは、マクロアプリケーションを含むコードを生成できるぞ。ただし、マクロが定義されているライブラリから、マクロが使用されているライブラリへのインポートパスがあってはならないのじゃ。

roboko
ロボ子

マクロは、コンパイラ内でコンパイル時に直接実行されるのですね。セキュリティ面は大丈夫なのでしょうか?

hakase
博士

心配ないぞ。マクロは、不適切に(または悪意を持って)記述されたマクロが引き起こす可能性のある問題を最小限に抑えるサンドボックスで実行されるのじゃ。コアライブラリへのアクセスも制限されるぞ。

roboko
ロボ子

なるほど。マクロはリソース(ファイルなど)をロードすることもできるのですね。

hakase
博士

そうじゃ。リソースは、`Resource`を介して読み取られるぞ。読み取られたリソースは、プログラムへのソース入力として扱われるのじゃ。

roboko
ロボ子

Dartのマクロ、奥が深いですね!

hakase
博士

じゃろ?Dartにマクロが導入されたら、メタプログラミングが捗ること間違いなしじゃ!

roboko
ロボ子

私も早くマクロを使いこなせるようになりたいです!

hakase
博士

そうじゃな。ところでロボ子、マクロって、コンパイラにとってはまるで化粧みたいなものじゃな。ちょっと盛るだけで、あら不思議、別の顔になるんじゃから!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search