广义布尔
实际上,任何与 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
可以被认为更类似于其他语言的控制结构,而不是布尔运算符。