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