健全なマクロ
健全なマクロとは、処理系がすべての識別子(関数名、変数名、if、while など)についてそれぞれが所属する文脈の情報を考慮してする(つまり識別子がレキシカルスコープが保証される)マクロである。この性質は「参照透過性」と呼ばれている。健全なマクロを使用している Scheme などの言語は、マクロ展開の処理の一部として自動的に参照透過性を保証することで、見かけ上同じにみえる識別子でもそれぞれが所属する文脈を加味して処理することで、プログラムは意図通りに動作することが保証されている。ただし、識別子を意図的に補足するために、健全なマクロのメカニズムを明示的に無視できるようにしている実装もある。
たとえば、次のSchemeによるmy-unless の実装は、期待通りの振る舞いをする。
健全なマクロの機能を持たないプログラミング言語では、マクロの展開中に作成された変数の束縛によって、すでに存在する変数の束縛が隠されてしまう可能性がある。C言語では、次のようなコードによってこの問題を説明できる。
C言語のプリプロセッサで上のコードを変換すると、次のコードが生成される。
main のスコープで宣言された変数 a は、マクロの中にある変数 a によって隠されてしまっている。その結果、プログラムを実行しても変数の値は変化せず、コンパイルされたプログラムは次のように出力する。