scheme - 为什么 + 和 * 分别计算为 0 和 1?

标签 scheme lisp

我正在使用 GNU/MIT 方案:

1 ]=> (+)

;Value: 0

1 ]=> (*)

;Value: 1

1 ]=> (-)

;The procedure #[arity-dispatched-procedure 2] has been called with 0 arguments; it requires at least 1 argument.
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

2 error> (/)

;The procedure #[arity-dispatched-procedure 3] has been called with 0 arguments; it requires at least 1 argument.
;To continue, call RESTART with an option number:
; (RESTART 2) => Return to read-eval-print level 2.
; (RESTART 1) => Return to read-eval-print level 1.

为什么 +* 分别被评估为 0 和 1。为什么评估 -/ 会抛出错误?

这部分是 Scheme 定义还是 GNU/MIT Scheme 中的实现细节?

最佳答案

这背后的原因是 +* 有标识元素

1 * x = x * 1 = x
0 + x = x + 0 = x

虽然 -/ 具有正确的身份,但作为左结合运算符,这否定了(双关语!)它们的值(value)。将可变参数加号视为数字列表的折叠是有意义的,因为从数学上讲,您无法将其与将它们一一相加区分开来。此外,空列表的折叠只是种子元素,即标识。

然而,由于 -/ 缺少标识元素,因此没有合理的默认值返回。

它是 R5RS 的一部分

关于scheme - 为什么 + 和 * 分别计算为 0 和 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662918/

相关文章:

list - 消除Scheme中列表中的空列表

list - 循环列表的神秘方案程序

algorithm - SICP练习1.28 : false negatives in the Miller-Rabin test

lisp - 一般来说, "lexical and special variable"语义是如何在幕后实现的?

closures - Pandoric Macro 中的符号如何编译出来?

hash - 方案高阶函数

scheme - 为什么Scheme的if语句中 '0'被视为真值?

scheme - Racket\Scheme 中的返回类型

lisp - 我如何创建一个函数来在 Lisp 中从右到左实现 lambda

unit-testing - Midje Clojure 中的 JUnit AfterClass 等价物?