我在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)
。
这里发生了什么?
答案 0 :(得分:9)
在第一组语言中,空列表不会被视为&#39; falsey&#39;而是被视为一个&#39; truthy&#39;值。在方案和球拍中,#false
是唯一的假值,因此即使'()
为空,null也不是假;在clojure中,空列表与nil不同,所以它是真正的&#39; truthy&#39;那里也是。
在第二组中,空列表是nil
的同义词,并被视为false,从而导致条件返回nil
。然而,具有元素的列表与nil不同,因此再次被视为truthy值。
最后一个难题是and
如果传递的所有值都是真实的,则返回最后的真值。
答案 1 :(得分:2)
在Clojure中,只有false
和nil
被视为逻辑错误。其他一切都被视为逻辑上的真实。
在你提到的其他Lisp中,空列表被视为逻辑错误。
答案 2 :(得分:2)
and
运算符评估参数和&#39;短路&#39;结果,即只要一个参数为假,它就返回nil。否则,它返回最后一个值。
行为的差异在于,在Common Lisp中,空列表与nil
相同,这与false相同,因此(and '() t)
与返回{(and nil t)
的{{1}}相同{1}}。