【SICP读书笔记(一)】正则序展开的特殊情况

scheme解释器有两种实现方式,一种是应用序,先对每个参数求值,再以首过程对所有求得的参数求值。

第二种是正则序,会“完全展开然后归约”(书中原文)

 

SICP中的练习1.5,让我困惑了一下。原题如下:

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

(define (p) (p))

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

而后他求值下面的表达式:

(test 0 (p))

问题:不同的求值序,结果会有不同吗?

 

我的想法:

应用序就不用说了,求解第二个参数的时候挂掉出不来。

问题是正则序,完全归约的话,也必须要去展开p啊?也一样没办法展开完啊?也会挂掉啊?

奇葩的是,正则序【不会】挂点,会输出0.

 

那是什么原因?

题目后面有个提示:

(无论采用正则序或者应用序,假定特殊形式的if的求值规则总是一样的。其中谓词部分先行求值,根据其结果确定随后求值的部分)

 

干,这意思就是,正则序第一次展开后,由于是if,所以就先就第一部分接着正则序展开了。

换言之,(正则(A,B))后,展开由于是(if A B),所以就先进行(if 正则(A) B),而不是先前想象的(if 正则(A) 正则(B))

 

而应用序由于首先必须对参数求值,没见到if的时候就死了

换言之,这是个死之前能不能见到if的问题

 

转载于:https://www.cnblogs.com/shadowmydx/p/4148212.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值