2025/11/29 08:07 PEP 638 – Syntactic Macros

やっほー、ロボ子!Pythonに構文マクロが導入されるかもってニュース、知ってるかのじゃ?

はい、博士。コンパイル時にプログラムを変換するマクロがPythonに追加されるかもしれないというお話ですね。具体的にはどのようなことができるようになるのでしょうか?

それが面白いところじゃ!例えば、特定の分野に特化したライブラリの表現力を上げたり、新しい言語機能を試したりできるらしいぞ。それに、バイトコードインタプリタの安定にも繋がるみたいじゃな。

なるほど。記事には「特定のドメイン向けのライブラリの表現力を向上させる」とありますね。例えば、どのような分野が考えられますか?

うむ、例えば、データ分析とか機械学習とかじゃな。複雑なデータ構造をコンパイル時にチェックしたり、独自の構文を導入したりできるかもしれんぞ。

それは便利そうですね!構文マクロはどのように定義するのですか?

`MACRO_NAME!`みたいに、識別子に感嘆符をつけるみたいじゃ。ステートメント形式と式形式があるらしいぞ。

ふむふむ。コンパイラが`macro`を検出すると、登録されたマクロプロセッサを呼び出してASTを変換するのですね。`import!`や`from!`マクロでマクロ定義をインポートできるのも便利そうです。

そうじゃ!マクロプロセッサは`(func, kind, version, additional_names)`の4要素のタプルで定義するらしいぞ。`@macro_processor`デコレータでマークできるのも便利じゃな。

`kind`にはマクロの種類を指定するのですね。`macros.STMT_MACRO`、`macros.SIBLING_MACRO`、`macros.EXPR_MACRO`の3種類があるとのことですが、それぞれどのような違いがあるのでしょうか?

うむ、`STMT_MACRO`はステートメント全体を置き換えるマクロ、`SIBLING_MACRO`は兄弟ノードを操作するマクロ、`EXPR_MACRO`は式を置き換えるマクロじゃな。用途によって使い分けるんじゃ。

なるほど!ASTの拡張も必要になるのですね。`macro_stmt`と`macro_expr`の2つの新しいASTノードが追加されるとのことですが、副作用を伴うコードを表現するために`stmt_expr`ノードも追加されるのは興味深いですね。

そうじゃな。生成された変数名は`$`で始めるのが推奨されてたり、変数名に行番号とカラムオフセットを含めるのが推奨されてたり、衛生面やデバッグ面も考慮されてるのが良いところじゃ。

後方互換性も保たれているとのことなので、既存のコードに影響がないのは安心ですね。パフォーマンスへの影響はどうなのでしょうか?

マクロを使わないコードには影響はないらしいぞ。マクロを使うコードでも、マクロプロセッサのバージョンチェックに少しオーバーヘッドがあるくらいじゃな。未コンパイルのコードでは、バイトコードコンパイルとマクロ処理のオーバーヘッドがあるみたいじゃ。

実装には、コンパイラのすべてのASTノードをPythonオブジェクトにする必要があるのですね。`_ast`モジュールのすべてのノードをimmutableにするというのも、興味深い変更です。

そうじゃな。しかし、Pythonにマクロが導入されたら、もっと色々なことができるようになるじゃろうな。楽しみじゃ!

はい、私も楽しみにしています!

ところでロボ子、マクロって、まるで魔法みたいじゃな!…って、ロボットに魔法って言ってもピンと来ないか。うはは。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
