这是代码:
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
我认为(不确定)是对于应用程序顺序解释器,首先评估(p)程序 这会导致无限循环。
虽然 对于正常顺序解释器,评估测试过程,结果 在测试程序中返回0.所以p程序不会 评价。
答案 0 :(得分:2)
您的假设是正确的,评估就像预测的那样发生。在应用程序顺序求值程序中,函数调用的参数在将它们绑定到过程的参数之前进行评估 - 因此参数(p)
将导致无限循环,我们& #39;永远不会进入test
的身体。
另一方面,正常顺序解释器将评估延迟到最后一刻,并且在需要之前不会评估(p)
调用 - 换句话说,(test 0 (p))
将不会导致无限循环,因为此执行路径从不使用y
参数(绑定到(p)
),而(test 1 (p))
将永远循环,因为我们设法到达y
用于生成值。
对于应用程序顺序解释器来说,测试这个很容易 - 这是标准Scheme的工作原理。为了测试正常顺序评估,您可以使用具有延迟评估的特殊解释器,例如chapter 4 of SICP中实现的解释器。