next up previous contents
Next: ( and g Up: 制御構造 Previous: ( progn 'g

( cond (g 11 g 12 ... g 1n) (g 21 g 22 ... g 2n) ... (g m1 g m2 ... g mn)) SPECIAL

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 である") ))



Riichiro Saito
1995年08月31日(木) 17時10分21秒 JST