对于使用应用程序订单评估和基于正常订单的解释器的解释器,我会看到什么行为?

时间:2014-10-03 16:51:47

标签: scheme interpreter sicp

这是代码:

(define (p) (p))
(define (test x y) 
     (if    (= x 0) 
          0 
          y))
(test 0 (p))

我认为(不确定)是对于应用程序顺序解释器,首先评估(p)程序    这会导致无限循环。

虽然    对于正常顺序解释器,评估测试过程,结果    在测试程序中返回0.所以p程序不会    评价。

1 个答案:

答案 0 :(得分:2)

您的假设是正确的,评估就像预测的那样发生。在应用程序顺序求值程序中,函数调用的参数在将它们绑定到过程的参数之前进行评估 - 因此参数(p)将导致无限循环,我们& #39;永远不会进入test的身体。

另一方面,正常顺序解释器将评估延迟到最后一刻,并且在需要之前不会评估(p)调用 - 换句话说,(test 0 (p))将不会导致无限循环,因为此执行路径从不使用y参数(绑定到(p)),而(test 1 (p)) 永远循环,因为我们设法到达y用于生成值。

对于应用程序顺序解释器来说,测试这个很容易 - 这是标准Scheme的工作原理。为了测试正常顺序评估,您可以使用具有延迟评估的特殊解释器,例如chapter 4 of SICP中实现的解释器。