乐正

Actions speak louder than words.

Sicp-ex1-5

问题

Ben Bitdiddle 发明了一种检测方法,能够确定解释器究竟采用哪种顺序求值,是采用应用 序,还是采用正则序。他定义了下面两个过程:

1
2
3
4
5
6
(define (p) (p))

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

而后他求值下面的表达式:(test 0 (p))

如果某个解释器采用的是应用序求值,Ben会看到什么样的情况?如果解释器采用正则序求 值,他又会看到什么情况?请对你的回答做出解释。(无论采用正则序或者应用序,假定特 殊形式if的规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达 式部分)。

解答

无论采用哪种求值方法,只要调用了函数p,就会变成一个无限调用自身的循环。

由于应用序求值是“解释器首先对运算符和各个运算对象求值,而后将得到的过程应用于得 到的实际参数”。所以,当我们将(p),传递给(test 0 (p))的时候,解释器会运算(p) 从而会使得解释器堵塞。 如果使用正则序求值,“先不求出运算对象的值,直到实际需要它们的时候再去做”,所以 (p)从始至终都不会得到调用,(test 0 (p))会返回0.

综上,如果(test 0 (p))返回0,则解释器采用正则序求值;如果解释器堵塞,那么解释器采用的为应用序求值。

draft

« sicp-ex1-4 sicp-ex1-6 »

Comments