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

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

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

而后求值下列表达式:

(test 0 (p))

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

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

使用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其实是采用应用序求值的。

 

 

名词解释:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值