衛生的マクロ
衛生的マクロ(Hygienic macro
健全なマクロ、衛生マクロ
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)がいつの間にか使えるようになっている 確認用
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