我正在使用GNU/MIT Scheme:
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
虽然-
并/
拥有正确的身份,但作为左联想运算符,这否定了(双关语)它们的价值.考虑到变量加号作为数字列表的折叠是有意义的,因为从数学上来说,初始元素是一个标识,你不能将它与将它们一个一个地加在一起区分开来.此外,空列表上的折叠只是种子元素,即身份.
然而,由于-
和/
缺乏身份的元素,没有理智的默认返回.
它是R5RS的一部分