LISP のマクロについて
LISP について調べると「LISP のマクロは強力」とか「マクロこそが LISP 最大の特徴」とかいう記事に当たる。
正直、今まではマクロが何故そんなに素晴らしいのか分からなかった。
てっきり、関数と同じように実行時に呼び出されるプロシージャの一種だと思っていた。
最近、マクロは コンパイル時に呼び出し元で展開される と知った。
目から鱗だった。
ああ、なるほど、これは一種のプリ・プロセッサであり、 コンパイラに対する指示書 なんだな、と。
ソース・プログラムから抽象構文木を生成する時に、指示を出して抽象構文木を組み替えるための機能。
抽象構文木を生成する過程で展開されたマクロは、構文木の枝として呼び出し元の位置に『接ぎ木』され、静的に固定される。
この処理は、機械語なりバイト・コードへのコンパイル前に行われる。
実行時に動的に呼び出し・展開される訳ではない、と。
一種の置換処理という事か。
C言語のプリ・プロセッサのようにソース・プログラム対して置換を行うのではなく、抽象構文木に対して置換を行うのだ。
なるほど、確かに使いようによっては強力そうだ。
2022-05-01
11:29