Shammer's Philosophy

My private adversaria

macroexpandをもう少し

macroexpandを使用すれば、マクロを展開してその処理内容を確認できる、ということはわかったけれども、これをマクロじゃないものに使用した場合どうなるのか?エラーになるのか?それとも・・・

? (macroexpand '(incf x))
(SETQ X (+ X 1))
T
? (macroexpand '(setq x (+ x 1)))
(SETQ X (+ X 1))
NIL
? (macroexpand '(+ 1 1))
(+ 1 1)
NIL
?

どうやら、マクロじゃないものはそのまま表示されるようだ。式の後のNILとTはおそらくマクロであったか、そうでなかったかを示すものと思われる。仕様で定められた動作なのか?それともLispランタイムの実装依存なのか?

 Common Lisp the Language, 2nd Edition
 8.2. Macro Expansion
 http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node99.html

に存在するところを見ると仕様っぽいな。どうやら、macroexpand-1という方を使うのがメインのようだ。

? (macroexpand-1 '(incf x))
(SETQ X (+ X 1))
T
? (macroexpand-1 '(+ 1 1))
(+ 1 1)
NIL
? 

違いはよくわからないな。必要になったときにドキュメントを細かく読むことにしよう。