ANDing一个布尔值和一个列表

Jef*_*att 5 scheme elisp clojure common-lisp racket

我已经在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.

这里发生了什么?

Ale*_* C. 9

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

在第二组中,空列表是同义词,nil并被视为false,从而导致条件返回nil.然而,具有元素的列表与nil不同,因此再次被视为truthy值.

拼图的最后一部分是,and如果传递的所有值都是真实的,则返回最后的真值.

  • @clementi在Scheme和Racket中,`null`与`'()`的值相同,但它(1)是真的,(2)打印为`()`或`'()`.在CL和elisp中,`nil`与`'()`的值相同,但是(1)它是假的,(2)它打印为`nil`,而不是`()`. (2认同)