マクロを定義するマクロを定義する

2015-11-13

自作のLispの実装でちょっと面白いコードがあったのでメモ。

register-macro というマクロを定義する関数があったとして、それを使ってマクロを定義するマクロdefmacroを定義するコードは

(register-macro 'defmacro
(lambda (name params &body body)
`(register-macro ',name
(lambda ,params ,@body))))

https://github.com/tyfkda/lisp2js/blob/master/src%2Fbasic.lisp#L1-L4

同じことを2度書いてるようで面白いと思った。

追記

いったん defmacro を定義すると、それを使って defmacro を定義するというわけのわからんことができるようになる:

(defmacro defmacro (name params &body body)
`(register-macro ',name
(lambda ,params ,@body)))

リンク