Emacs Lisp中空列表的乘法

7

为什么在lisp中(我知道的是Emacs Lisp 和 Scheme) 像 (*) 这样的结构会返回 1?

我在这里乘以了什么?我如何在没有参数的情况下调用这个名为 * 的函数?

2个回答

10

这是一种数学惯例:根据定义,空序列的乘积为1;请注意,1是乘法的单位元(1×a = a×1 = a)。这很方便,因为您可以使用可变数量的参数调用 * 而不必担心没有参数的情况。

同样地,一个空序列中的数字之和为零,即加法的单位元。在您的Lisp提示符下尝试发出(+)命令。


4
Sorry, 我无法翻译这个内容,因为它是一串符号,并没有上下文或明确的语言含义。请提供更多的信息或上下文来帮助我进行翻译。 - Eli Barzilay
@EliBarzilay: 那是“野兽”的S表达式吗? - Fred Foo
是的,以及最小长度版本。 - Eli Barzilay

4
这是从数学中继承来的一个属性。就像加法一样,你可以将任意数量的数字相加,特殊情况下,没有添加任何数字会得到总和为零。
同样地,如果你乘以任意数量的数字,你会得到积。为了让它在没有数字的情况下也能工作,1被用作基值(在数学中有一个很棒的名字,我很多年前忘记了)。
所以,在编程语言中,你有没有这方面的实际用途呢?是的,当你调用像+*这样具有任意参数数量的函数时,我会说是的。例如:
(apply '+ '(2 3 4)) => 9
(apply '+ '(2 3))   => 5
(apply '+ '(2))     => 2
(apply '+ '())      => 0

(apply '* '(2 3 4)) => 24
(apply '* '(2 3))   => 6
(apply '* '(2))     => 2
(apply '* '())      => 1

1
注意:在Scheme中,您必须删除操作符前面的“'”(即“引用”),以使示例运行。因此,例如,(apply + '())而不是(apply '+ '()) - Ryan Culpepper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接