乘法运算符
Multiplication operator
在方案中 * returns 其参数的乘积。如果不带参数调用它 returns 1,或者带一个参数它 returns 参数:
(*) => 1
(* 2) => 2
这是什么语义?它怎么能return任意值呢?它似乎隐含地添加参数 1 来执行乘法。哪里解释了?
遇到以下问题时,我想到了这个问题:
(call-with-values * -) => -1
显然这是因为 1 是乘法的恒等式,但我看不到它在任何地方被提及。简而言之,为什么没有参数的乘积是1?
这是 +
和 *
的有用 属性:它们都 return 在不带参数调用时各自操作的标识。 (+)
returns 0
而不是简单地抛出错误这一事实可能更有用,因为它使使用 (apply + list-of-numbers)
对列表求和的常见习惯用法适用于空列表。同样,您可以使用 *
来计算列表中所有数字的乘积,但这可能不太明显有用。
不过,我认为 +
的类比足以证明 *
的零参数行为至少 是有意义的 。我不认为让它抛出会阻止所有的错误,它可能会使一些有用的代码更难编写。我认为使 return 身份提高语言的“流畅性”这一事实(它在内部更加一致)是 Scheme 感觉如此干净和有原则的语言的原因之一。
在方案中 * returns 其参数的乘积。如果不带参数调用它 returns 1,或者带一个参数它 returns 参数:
(*) => 1
(* 2) => 2
这是什么语义?它怎么能return任意值呢?它似乎隐含地添加参数 1 来执行乘法。哪里解释了?
遇到以下问题时,我想到了这个问题:
(call-with-values * -) => -1
显然这是因为 1 是乘法的恒等式,但我看不到它在任何地方被提及。简而言之,为什么没有参数的乘积是1?
这是 +
和 *
的有用 属性:它们都 return 在不带参数调用时各自操作的标识。 (+)
returns 0
而不是简单地抛出错误这一事实可能更有用,因为它使使用 (apply + list-of-numbers)
对列表求和的常见习惯用法适用于空列表。同样,您可以使用 *
来计算列表中所有数字的乘积,但这可能不太明显有用。
不过,我认为 +
的类比足以证明 *
的零参数行为至少 是有意义的 。我不认为让它抛出会阻止所有的错误,它可能会使一些有用的代码更难编写。我认为使 return 身份提高语言的“流畅性”这一事实(它在内部更加一致)是 Scheme 感觉如此干净和有原则的语言的原因之一。