2007/12/04

[Common Lisp] マクロを定義するマクロ(Anaphora より)

Anaphora はアナホォリックマクロを集めたライブラリです。
その中でマクロを定義するマクロが使われています。
if や and ごとに直接アナフォリックマクロを定義するのではなく、アナフォリックマクロを定義するマクロ anaphoric を定義した上で、それを利用して if や and のアナフォリックマクロ(aif, aand, etc.)を定義しています。
Lisp ならではの素敵なコードです。

On Lisp でもアナフォリックマクロとマクロを定義するマクロが解説されています。

Anaphora の anaphora.lisp より抜粋です。

(defmacro anaphoric (op test &body body)
`(let ((it ,test))
(,op it ,@body)))

(defmacro aif (test then &optional else)
`(anaphoric if ,test ,then ,else))

(defmacro aand (first &rest rest)
`(anaphoric and ,first ,@rest))

(aif (car '("Hello" "World"))
(format nil "~a World!" it))
;; ==> "Hello World!"

(aand (cdr '(1 2 3)) (cdr it) (cdr it))
;; ==> 3

0 件のコメント: