Scheme 乘法运算符

Scheme 乘法运算符,scheme,guile,Scheme,Guile,In Scheme*返回其参数的乘积。如果在没有参数的情况下调用,则返回1,或者在只有一个参数的情况下返回参数: (*) => 1 (* 2) => 2 这句话的语义是什么?它如何返回任何值?它似乎隐式地添加了一个参数1来执行乘法。这是怎么解释的 当我遇到以下情况时,我想到了这个问题: (call-with-values * -) => -1 很明显,这是因为1是乘法的恒等式,但我看不到这里提到过。简而言之,为什么没有参数的乘积是1?这是+和*的一个有用属性:在没有参数的情

In Scheme*返回其参数的乘积。如果在没有参数的情况下调用,则返回1,或者在只有一个参数的情况下返回参数:

(*) => 1
(* 2) => 2
这句话的语义是什么?它如何返回任何值?它似乎隐式地添加了一个参数1来执行乘法。这是怎么解释的

当我遇到以下情况时,我想到了这个问题:

(call-with-values * -) => -1

很明显,这是因为1是乘法的恒等式,但我看不到这里提到过。简而言之,为什么没有参数的乘积是1?

这是
+
*
的一个有用属性:在没有参数的情况下调用它们时,它们都返回各自操作的标识。
(+)
返回
0
而不是简单地抛出错误,这一事实可能更为明显,因为它使使用
(应用+数字列表)
对列表求和的常用习惯用法适用于空列表。类似地,您可以使用
*
获取列表中所有数字的乘积,但这可能不太有用


尽管如此,我认为与
+
的类比足以证明
*
的零参数行为至少是有意义的。我不认为抛出它可以防止那么多的bug,而且可能会使一些有用的代码更难编写。我认为,让Scheme返回标识可以提高语言的“流畅性”(内部更为一致),这是Scheme感觉像是一种干净、有原则的语言的原因之一。

当然,模糊处理:请注意,
以及
在无参数调用时的工作方式相同:
(和)
返回
\t
(或)
返回
\f
。正如Alexis的回答所说,它使语言内部更加一致,减少了代码必须处理的极端情况。