ANDing一个布尔值和一个列表

时间:2016-11-17 17:08:38

标签: clojure scheme common-lisp elisp racket

我在Scheme,Racket和Clojure中注意到表达式(在此处使用Clojure)var sizestring= $('.wpmlposts').length; for (i=0;i <sizestring;i++){ } 评估为(and true '()),而()评估为(and '() true)。这不仅适用于空列表,也适用于任何列表。

但在GNU CLISP和Emacs Lisp中,true评估为(and t '())nil评估为(and '() t),但nil评估为(and t '(1 2 3)) }和(1 2 3)评估为(and '(1 2 3) t)

这里发生了什么?

3 个答案:

答案 0 :(得分:9)

在第一组语言中,空列表不会被视为&#39; falsey&#39;而是被视为一个&#39; truthy&#39;值。在方案和球拍中,#false是唯一的假值,因此即使'()为空,null也不是假;在clojure中,空列表与nil不同,所以它是真正的&#39; truthy&#39;那里也是。

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

最后一个难题是and如果传递的所有值都是真实的,则返回最后的真值。

答案 1 :(得分:2)

在Clojure中,只有falsenil被视为逻辑错误。其他一切都被视为逻辑上的真实。

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

答案 2 :(得分:2)

and运算符评估参数和&#39;短路&#39;结果,即只要一个参数为假,它就返回nil。否则,它返回最后一个值。 行为的差异在于,在Common Lisp中,空列表与nil相同,这与false相同,因此(and '() t)与返回{(and nil t)的{​​{1}}相同{1}}。