衛生的マクロ
衛生的マクロ(Hygienic macro
健全なマクロ、衛生マクロ
On LispでLispを学んでいたときに出てきた
defmacroでマクロを組んでいる際に変数の挙動が期待しないものになる場合がある
マクロ中で定義されているものが既存の変数とバッティング(または衝突)して期待した結果にならない
マクロ内で使用する引数が1回だけ評価してほしいのに複数回評価されてパフォーマンスが悪くなる
Common Lispの場合(gensym)などを使用して一意な変数を生成して衝突を起こさないようにする
code:lisp
;; ref: On Lisp 2. 変数捕捉と多重評価
(defmacro for ((var start stop) &body body)
(let ((gstop (gensym)))
`(do ((,var ,start (1+ ,var)) (,gstop ,stop)) ((>= ,var ,gstop))
,@body)))
\`
準クオート(Quasiquote)
\`の記号自体はバッククォート
,
アンクォート(unquote)
,に続く引数を評価する
,@
アンクォート・スプライシング(unquote-splicing)
,@bodyとなっていたらbodyがそのまま展開される
Emacs Lispでもcl-libの(cl-gensym)ではなく、ビルトインの(gensym)がいつの間にか使えるようになっている
Leanにも衛生的マクロが実装されている
『Beyond Notations: Hygienic Macro Expansion for Theorem Proving Languages』に詳しい経緯が書かれている
確認用
Q. 衛生的マクロ
参考
変数捕捉と多重評価
Creating Symbols (GNU Emacs Lisp Reference Manual)
やさしいLispマクロの使い方 #lisp - Qiita
準クオート (Gauche ユーザリファレンス)
メモ
/kuuote/Schemeの衛生マクロ機構
Eugene Kohlbecker, Daniel P Friedman, Matthias Felleisen, and Bruce Duba. Hygienic macro expansion. In Proceedings of the 1986 ACM conference on LISP and functional programming, pages 151–161, 1986.
調査用
Google.icon 衛生的マクロ(日)
Google.icon Hygenic macro(英)
Wikipedia.icon
衛生的マクロ - Wikipedia(日)
衛生的マクロ(検索) - Wikipedia(日)
健全なマクロ - Wikipedia(日)
健全なマクロ(検索) - Wikipedia(日)
Wikipedia.icon
Hygienic macro - Wikipedia(英)
Hygienic macro(検索) - Wikipedia(英)