Perl6のマクロ

Perl6にはASTを操作する本格的なマクロがある。それをわかりやすく解説したポスト:
http://strangelyconsistent.org/blog/macros-what-are-they-really

コードからASTを得る

quasi { <コード> }

quasiはQuineという哲学者の「quasi-quote」というコンセプトに由来している。ちなみにこれはクワイン プログラムの由来の人でもある。

マクロ宣言:

macro <マクロ名> { }
macro HOGE { quasi { $*ERR.say("OH HAI") } }

マクロの呼び出し

HOGE();
関数のようなシンタックス。Cのようにマクロは大文字にするのが慣習のようだ。ただし…

マクロへの引数はその値ではなくて、コンパイラによりコードから変換されたAST

ASTをコードに埋め込む: {{{AST}}}

quasi {
$*ERR.say(DateTime.now, ": ", {{{$message}}});
}
ここで$messageはAST。quasiは{}内のコードテキストをASTに変換するが、そこに「引数」として与えられたASTを埋め込みたい。その歳にトリプル括弧を使う。こうすることによってコード(テキスト)とASTを自由自在に混ぜることができる。LISPだと「'」や「,」を組合せてやるのをPerl6だとこうなるようだ:
macro { quasi { {{{}}} {{{}}} ... } }

評価の順序

これにより LOG(recursive_fib(42)); というコードがあってもLOG内のif文によりrecursive_fib(42)を評価しないことが可能である。(元記事参照) つまり式をランタイムに条件付きで評価することを可能にしてくれる。

LISPと同等の威力を持つマクロシステムだと納得がいく。マクロ御本家のLISPは簡潔な操作表記を使う一方Perl6は助長な表現。どっちが使い易いものになるかは時間がたたないと結論はでないだろう。

汎用言語(を目指す)もので本格的マクロをサポートしているという意味ではPerl6はユニークな存在だろう。(LISP系で汎用言語を目指している言語には失礼) lazyでマクロ付き。これからが楽しみなPerl6だ。