LispのMacro

始めて知った。Schemeにはあるのかな。cs61Aで使ったときはそんなのやってなかった気がする。よく言われてることだけどLispだとDSLが容易ってのはこのことね。するにはこれはいいですね。

たとえばリストを作るときは
> (list 1 2 3)
> (1 2 3)
そこでこんなマクロを作ると
(defmacro backwards (expr) (reverse expr))
こんなことになる
> (backwards (3 2 1 list))
> (1 2 3)

Lispのマクロでは引数がevaluateされずにマクロに渡されて、それが新たなexpressionを返す。それからやっとevaluateされる。詳しい事はPractical Common Lispのチャプター3Practical: A Simple Databaseに書いてあります。また寄り道してる。もっとRubyを読み進めないとです。