(cond (条件式 式 .. 結果式)...(条件式 式 ..結果式))という構文で,条件式が nilでない リストの式を順に評価し最後の式の結果 をcondの値として返すものです.
<cl> (macroexpand '(cond (a b) (c d) (e f))) (IF A (PROGN B) (COND (C D) (E F)))ここで,macroexpandした中にさらに condが残っていますが,マクロフォーム の評価は,フォームの先頭がマクロの時にその先頭がマクロでなくなるまで (つまり,フォームがスペシャルフォームか,関数フォームになるまで)展開 を行ない,その後でそのフォームの評価を行なった結果を最初のマクロフォー ムの評価結果として返します.この,フォームの先頭がマクロでなくなるまで 展開した後,そのフォームの評価を行ない,そのフォームの内部にマクロがあっ ても,その内部のものまでを最初に展開してしまわないところがミソです.と いうのは,内部のものまで一度に展開してしまうと,大変大きなリストができ たり,無限リストになったりする場合があるからです.