青葉台旭のノートブック

LISP のマクロについて

LISP について調べると「LISP のマクロは強力」とか「マクロこそが LISP 最大の特徴」とかいう記事に当たる。

正直、今まではマクロが何故そんなに素晴らしいのか分からなかった。

てっきり、関数と同じように実行時に呼び出されるプロシージャの一種だと思っていた。

最近、マクロは コンパイル時に呼び出し元で展開される と知った。
目から鱗だった。

ああ、なるほど、これは一種のプリ・プロセッサであり、 コンパイラに対する指示書 なんだな、と。
ソース・プログラムから抽象構文木を生成する時に、指示を出して抽象構文木を組み替えるための機能。

抽象構文木を生成する過程で展開されたマクロは、構文木の枝として呼び出し元の位置に『接ぎ木』され、静的に固定される。
この処理は、機械語なりバイト・コードへのコンパイル前に行われる。
実行時に動的に呼び出し・展開される訳ではない、と。

一種の置換処理という事か。
C言語のプリ・プロセッサのようにソース・プログラム対して置換を行うのではなく、抽象構文木に対して置換を行うのだ。

なるほど、確かに使いようによっては強力そうだ。

2022-05-01 11:29