Clojure 没有参数(and)返回t

Clojure 没有参数(and)返回t,clojure,scheme,lisp,common-lisp,Clojure,Scheme,Lisp,Common Lisp,CL和Scheme都定义了(和),以返回t(或#t)而不带任何参数 我试图理解这一点的基本原理。我天真的假设是,一个空集是错误的,传入零个参数感觉就像传入任何可能为真的东西 编辑:clojure遵循相同的约定。我肯定缺少一些基本的Lisp假设。空乘积为1。原因是1是*的中性元素 如果你有2和3的乘积,然后乘以零的乘积,你会得到2*3*1=6。我们可以写作 (product (product 2 3) (product)) = (product 6 1) = 6 与和相同的计算: (

CL和Scheme都定义了
(和)
,以返回
t
(或
#t
)而不带任何参数

我试图理解这一点的基本原理。我天真的假设是,一个空集是错误的,传入零个参数感觉就像传入任何可能为真的东西


编辑:clojure遵循相同的约定。我肯定缺少一些基本的Lisp假设。

空乘积为1。原因是1是
*
的中性元素

如果你有2和3的乘积,然后乘以零的乘积,你会得到2*3*1=6。我们可以写作

  (product (product 2 3) (product)) 
= (product 6 1) 
= 6
相同的计算:

  (and (and #t #t) (and)) 
= (and #t ?) 
= #t
我们希望空的
(and)
给出一个不影响结果的值
。 答案是
#t
,因为
#t
是一个中性元素

(and x #t) = x   for all boolean x

这里有一个更直观的答案:“和”就像一个清单:当清单上的所有事情都是真的时,你就“完成了”(也就是说,真的)。假设有人给了你一张空的清单;在这种情况下,你没有什么需要检查的,你做得很简单。

我的尝试是尽可能简单地说:
表达式如果且只有至少一个参数为false,则为false,否则为true。因此,如果没有参数,则基本上是正确的。

类似地,空or应该为false。一般来说,如果你把一个二元运算符推广为n元,让0元大小写返回运算符的identification元素是很有用的。这个术语是“identity”。零是加法恒等式,一是乘法恒等式。对于逻辑and,恒等式是真的,对于逻辑or,恒等式是假的。维基百科的文章中有一些背景。我想另一种说法是,连接就像乘法,它是所有参数与通用集的交集。通用集合是乘法运算的1,而对于连接则是“T”。如果ITER对你有用,你就应该考虑。