SICP-1.1-Excercise1.5: 正则序求值与应用序求值

为了验证我们所使用的Scheme解释器到底是使用应用序还是正则序求值,可以定义下面两个过程:

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

而后求值下列表达式:

(test 0 (p))

如果解释器采用的是应用序求值,我们会看到什么?如果解释器采用的是正则序求值,我们又会看到什么?(假定不论采用应用序还是正则序求值,if的求值规则都是一样的。if表达式的一般形式是:

(if ),在求值一个if表达式时,解释器首先对部分进行求值,如果得到真值,解释器就去求值并返回其值,否则它就去求值并返回其值。

使用DrScheme试验后,发现输入(test 0 (p))后回车,然后程序就陷入假死状态了,没有任何输出。这又是为什么呢?

其实(define (p) (p))定义了一个无限递归调用的过程p,如果解释器采用正则序求值的话,它会先进行(test 0 (p))的展开,展开后变成:

(if (= 0 0)
    0
    (p)))

显然这里就不会再去计算(p)的值了,结果输出为0。

那么如果解释器采用应用序求值呢?它会首先计算(test 0 (p))各参数的值,然后再应用,那么0的值就是0,而计算(p)的值时,由于过程p是个无限递归调用的过程,所以程序就会进入前面所说的假死状态而没有任何输出。所以,DrScheme其实是采用应用序求值的。

 

 

名词解释:

正则序求值:“完全展开而后归约”的求值模型

应用序求值:“先对参数求值而后应用”的求值模型

你可能感兴趣的:(scheme,基础知识)