サーチ…


真と偽

特殊記号TはCommon Lispの値trueを表し、特殊記号NILfalseを表します

CL-USER> (= 3 3)
T
CL-USER> (= 3 4)
NIL

それらは値変更できない変数であるため、標準では「定数変数」(sic!)と呼ばれています。結果として、以下のような通常の変数には名前を使用できません。例:

CL-USER> (defun my-fun(t)
           (+ t 1))
While compiling MY-FUN :
Can't bind or assign to constant T.

実際には、それらを単に定数とみなしたり、自己評価シンボルとして考えることができます。 TNILは他の感覚でもスペシャルです。たとえば、 Tも型(他の型のNIL型)であり、 NILも空のリストです。

CL-USER> (eql NIL '())
T
CL-USER> (cons 'a (cons 'b nil))
(A B)

一般化ブール値

実際には、 NILと異なる値はCommon Lispでは真の値とみなされます 。例えば:

CL-USER> (let ((a (+ 2 2)))
           (if a
               a
               "Oh my! 2 + 2 is equal to NIL!"))
4

この事実をブール演算子と組み合わせて、プログラムをより簡潔にすることができます。たとえば、上記の例は次のものと同等です。

CL-USER> (or (+ 2 2) "Oh my! 2 + 2 is equal to NIL!")
4

マクロORは引数を左から右の順に評価し、NIL以外の値を見つけたらすぐに停止して返します。すべてがNIL場合、返される値はNILです。

CL-USER> (or (= 1 2) (= 3 4) (= 5 6))
NIL

同様に、マクロANDは引数を左から右に評価し、すべてがNILでないと評価された場合は最後の値を返し、そうでなければNIL見つけたら直ちに評価を停止して返します。

CL-USER> (let ((a 2)
               (b 3))
           (and (/= b 0) (/ a b)))
2/3
CL-USER> (let ((a 2)
               (b 0))
           (and (/= b 0) (/ a b)))
NIL

これらの理由から、 ANDおよびORは、ブール演算子ではなく、他の言語の制御構造と類似していると考えることができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow