衛生的マクロ
衛生的マクロ(Hygienic macro)
健全なマクロ、衛生マクロ
普通にマクロの機能を実装していくと、既存の変数と衝突して意図した結果にならないということがある
Common Lispでは、defmacroでマクロを組んでいる際に変数の挙動が期待しないものになる場合がある
マクロ中で定義されているものが既存の変数とバッティング(または衝突)して期待した結果にならない
マクロ内で使用する引数が1回だけ評価してほしいのに複数回評価されてパフォーマンスが悪くなる
この場合、(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)がいつの間にか使えるようになっている 確認用
Q. 衛生的マクロ
参考
メモ
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.
調査用
Wikipedia.icon
Wikipedia.icon