実践CommonLispを読むその7
第八章 マクロ:自分で定義しよう
と言うわけで自分で定義します。
本にあったマクロの説明、物語仕立てで説明してあったんだが分かりにくい例えがさっぱり分からなかった。それよりも「マクロの仕事は直接何かを実行するのではなくプログラムコードを作り出すことだ。」の一文の方がよっぽど理解するのに役立った。なるほどな〜コードジェネレータだと考えていいの?
(defmacro name (parameter*) "省略可能なドキュメンテーション文字列" body-form*)
試しにマクロを書いてみてなんとなく分かった。がマクロの書き方が難しいよね「`」「,」「@」の利用法、というか展開の行われ方が、なかなか覚えられないな。本見ながらできればいいか。
MACROEXPAND-1
これは覚えとくべきかな、マクロの展開を見るための関数。マクロが思い通り動いてない場合、実際にマクロを展開して、どのように展開されているのかを確認する必要があるだろうね。そんなときに役に立つ関数。
マクロって慣れるまで難しいよ。それ以降の説明が理解不能なんだが・・・は〜もう一度読み直す予定なんだが、むついな〜でもなんだろ、面白いよねLISPって誰かが言ってたけど「年に1つ新しい言語を覚えよう」って、しかも業務で利用するような言語ではなく利用しそうもない言語を。
まあ〜気長にやるさ。
バッククォートシンタックスがね〜と言うわけで覚書。
バッククォート | 等価なリスト | 展開結果 |
---|---|---|
`(a (+ 1 2) b) | (list 'a '(+ 1 2) 'b) | (a (+ 1 2) b) |
`(a ,(+ 1 2) b) | (list 'a (+ 1 2) 'b) | (a 3 b) |
`(a (list 1 2) b) | (list 'a '(list 1 2) 'b) | (a (list 1 2) b) |
`(a ,(list 1 2) b) | (list 'a (list 1 2) 'b) | (a (1 2) b) |
'(a ,@(list 1 2) b) | (append (list 'a) (list 1 2) (list 'b)) | (a 1 2 b) |
へ〜って感じ。慣れるまで難しいな〜慣れる日が来るのだろうが・・・
[0]> (gensym) #:G3219 [1]> (gensym 100) #:G100 [2]> (gensym "lisp") #:|lisp3221|
「gensym」って何て読むんだろうね。これの使いどころはマクロの中でのみ利用する変数に関して、その変数と同じ文字列を引数として与えられると困った事が起こる可能性があるので、ユニークなシンボルを返すときに利用するそうだ。なるほどね。