cond 式は if 〜 then 〜 else if 〜 then 〜 else if 〜 then ... else 〜 の構造を与える 式である。上記の cond 式は C の if-then-else で記述すると だいたい以下のようにな る。
if (g11) { g12; ... g1n; } else if (g21) { g22; ... g2n; } else if (gm1) { gm2; ... gmn; }
すなわち、g 11、g 21、... g m1 が、いずれかが非 nil を 返すまで順番に評価される。g i1 が非 nil を返した場合、g i+11 〜 g m1 までの式は評価されない。
条件式 g 11、g 21、... g m1 を順番に評価していき、g i1 が非 nil を返した場合、g i1 の右に記述されている g i2、 ... g in が順に評価され、g in の評価結果が cond 式の値として返さ れる。g i1 の右側に全く式が存在しない場合には g i1 の評価結 果そのものが cond 式の値として返される。
条件式 g 11、g 21、... g m1 がいずれも nil を返した場合は cond 式の結果は nil となる。
ところで、cond 式の条件式として t が与えられた場合には t の右側が else 条件として評価される。 これはたとえ t に nil が束縛されていたとしてもそうである。 以下の関数 double は引数として nil を与えた場合、 (nil nil) を返し、 (foo nil) は nil を 返すのに対して、(bar nil) は nil ではなく、文字列 "nil である" を 返すことを注意されたい。
(defun double (t) (list t t)) (defun foo (x) (cond ((not (null x)) "nil ではない") (x "nil である") )) (defun bar (t) (cond ((not (null t)) "nil ではない") (t "nil である") ))