SICP的习题1.5 主要讲的是函数参数的求值方式,包括应用序和正则序。
解题前如果发现自己对应用序和正则序还不是太清楚,就需要重新看看1.1.5节“过程应用的代换模型”,对应用序和正则序有了较清楚的了解后解习题1.5就比较简单了。
先看看题目,题目讲的是一个叫Ben Bitdiddle的人发明了一种检测方法,可以确定解释器使用的使用那种求值序,就是判断解释器是使用应用序还是正则序求值。
他的方法是定义下面两个过程:
(define (p) (p))
(define (test x y) (if (= x 0)
0
y))
然后执行下面的表达式:
(test 0 (p))
题目问我们,如果解释器是应用序求值会看到什么情况,如果是正则序又会看到什么情况。
如果对应用序和正则序理解比较透彻的同学可以直接读代码想到结果。
如果不是很清楚的话简单的方法就是在mit-scheme环境里试一下上面的过程。结果就是你的mit-Scheme环境“死机”了,就是没有反应了,原因是mit-Scheme使用的是应用序,当解释器求(test 0 (p))的值的时候会尝试求出参数0和参数(p)的值,参数0没什么好求的,已经是基本数字,参数(p)就不好求值了,解释器发现(p)是一个过程,执行它返回的结果还是(p),于是又求(p)的值,一直下去,子子孙孙无穷溃也,于是解释器就“死机”了。
更广泛地