Special Form: if condition then-form else-forms*
この特殊フォームは、最初に condition を評価し、これが nil でない値を返す場 合、(if は) then-form を評価し、値を返します。
condition が nil に評価された場合、(then-form の代りに) else-forms を評価 し、その最後の値を返します。 else-forms が存在しない場合、if は nil を返し ます。
以下に示した例において、選択されなかったフォームは評価されない点に注意する ことが必要です。 (このため) 2 番目の例では true は(関数 print で) print さ れ、フォームの値として返されますが、 false は print されません。
(if t 'true 'false) => true (if t (print 'true) (print 'false)) -> true =>true (if t 'true) => true (if nil 'true)
=> nil (if nil (print 'true) (print 'false) 'very-false) -> false => very-false
Special Form: cond clauses*
この特殊フォームは、最初に clauses 中の各 clause の car を(与えられた順に) non-nil が返されるまで評価します。 (訳注:non-nil を返した) clause が (condition body) の形である場合、cond はこの body を implied progn として 評価し、その結果を返します。この clause が (condition) の形である場合、 (この condition の値が non-nil の場合) その値を返します。
成功する clause が存在しない場合、 cond フォームは "通り抜け(訳注:falls through)"、 nil を返します。 (意図しない) 通り抜けを防ぐため、(t something ) を最後の clause として持つようにして下さい。
以下の例では、最初の clause が選ばれることはなく、式 (print 1) は評価され ません。
(cond (nil (print 1)) (t 2) (t 3)) => 2 (cond (nil (print 1)) (nil 2) (t 4 'two)) => 'two (cond (nil (print 1)) (nil 2) (nil) (3)) => 3 (cond (nil (print 1)) (nil 2))
=> nil
cond と if は(相互に)変換することができます。どちらを用いるかは、(全く)好 みやスタイルの問題です。例えば、
(if a b c) == (cond ( a b) (t c))
Function: not object
この関数は、 object が nil の場合 t を返します。それ以外の値の場合 nil を 返します。 not は null と同じではありません。
Special Form: and forms*
この特殊フォームは、1つ以上のアーギュメントを受け取り、それらを 1度に 1つ ずつ評価します。それらが(全て) non-nil の値に評価された場合、最後のフォー ムの値を返します。あるアーギュメントが nil に評価された場合 and は (残りの アーギュメントを評価せずに) nil を返します。
(and (print 1) (print 2) (print 3)) -> 1 -> 2 -> 3 => 3 (and (print 1) nil (print 2) (print 3)) -> 1 => nil
and は、if や cond で書くことができます。例えば、
(and arg1 arg2 arg3) == (if arg1 (if arg2 arg3))
Special Form: or forms*
この特殊フォームは、1つ以上のアーギュメントを受け取り、それらを 1度に 1つ ずつ評価します。それらが全て nil に評価された場合、or は nil を返します。 あるアーギュメントが non-nil の値に評価された場合、or は (残りのアーギュメ ントを評価せずに) その値を返します。
(or nil (eq 1 2) (progn (print 'x) nil)) -> x => nil (or 1 (eq 1 2) (progn (print 'x) nil)) => 1
or も、(and 同様) cond や if で書くことができます。
(or arg1 arg2 arg3) == (cond (arg1) (arg2) (arg3))