common-lisp                
            ブール値と一般化ブール値
        
        
            
    サーチ…
真と偽
特殊記号TはCommon Lispの値trueを表し、特殊記号NILはfalseを表します 。 
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.
実際には、それらを単に定数とみなしたり、自己評価シンボルとして考えることができます。 TとNILは他の感覚でもスペシャルです。たとえば、 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