AND 一个布尔值和一个列表

ANDing a boolean and a list

我注意到在 Scheme、Racket 和 Clojure 中,表达式(此处使用 Clojure)(and true '()) 的计算结果为 (),而 (and '() true) 的计算结果为 true .这不仅适用于空列表,而且适用于任何列表。

但是在 GNU CLISP 和 Emacs Lisp 中,(and t '()) 的计算结果为 nil(and '() t) 的计算结果也为 nil,但是 (and t '(1 2 3)) 的计算结果为 (1 2 3)(and '(1 2 3) t) 的计算结果为 t.

这是怎么回事?

在 Clojure 中,只有 falsenil 在逻辑上被认为是错误的。其他一切都被认为在逻辑上是正确的。

在您提到的其他 Lisp 中,空列表在逻辑上被视为错误。

在第一组语言中,空列表不被视为 'falsey',而是被视为 'truthy' 值。在 scheme 和 racket 中,#false 是唯一的 false 值,因此即使 '() 为 null,null 也不是 false;在 clojure 中,空列表与 nil 不同,所以它也是 'truthy'。

在第二组中,空列表是nil的同义词,被视为false,导致条件为return nil。然而,包含元素的列表与 nil 不同,因此再次被视为真值。

拼图的最后一块是 and return 如果所有传递的值都是真值,那么它就是最后一个真值。

and 运算符计算参数和 'shortcircuits' 结果,即一旦一个参数为假,它 returns 为零。否则,它 returns 最后一个值。 行为上的区别在于,在 Common Lisp 中,空列表与 nil 相同,与 false 相同,因此,(and '() t)(and nil t) 相同,returns nil.