【SICP习题1.5解答】
drracket吧
全部回复
仅看楼主
level 11
Ben Bitdiddle发明了一种检测方法,能够确定解释器究竟采用哪种求值,是采用应用序,还是采用正则序。他定义了下面两个过程:
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
而后他求值下面的表达式:
(test 0 (p))
如果某个解释器采用的是应用序求值,Ben会看到什么情况?如果解释器采用正则序求值,他又会看到什么情况?请对你的回答做出解释。(无论采取正则序或者应用序,假定特殊形式if的求值规则总是一样的。其中的谓词部分先行求值,根据其结果确定随后求值的子表达式部分。)
2014年03月31日 11点03分 1
level 11
1.结果
应用序求值,程序将进入死循环不会输出结果。
正则学求值,结果为0
------------------
2.分析
应用序
(test 0 (p)) -> (test 0 (p)的结果) 再展开。由于(p)是一个自循环函数,所以程序将陷入死循环,不会进入扩展。
正则序
(test 0 (p)) -> (if (= x 0) 0 (p)) -> 0
正则序不预先求值,而是等展开后再求值,由于if特殊操作,先对谓词运算,然后根据结果再对
正确的
分支进行计算,由于x=0,判断为真,直接输出0。不再对(p)进行计算了。
------------------
scheme的宏是正则序的,而宏扩展后的程序仍然是应用序的。可以应用这个特性做一些特殊的运算。
2014年03月31日 11点03分 2
level 1
你把应用和正则搞反了
2018年01月10日 15点01分 3
楼主没搞反,应用序求值要先求运算对象的值而后得到实际参数,这个明显陷入死循环了。
2018年11月30日 09点11分
1