练习1.5
Ben 发明了一种检测方法来确定Lisp的解释器采用应用序(Applicative Order)还是正则序(Normal Order)来求值。
他定义了下面两个过程并进行检测:
;过程定义 (define (p) (p)) (define (test x y) (if (= x 0) 0 y)) ;检测 (test 0 (p))
问解释器使用应用序和正则序时分别输出什么结果?
解释器怎么解释这段程序呢?
如果是按正则序的话,解释器会“完全展开而后规约”,所以求值流程如下:
(test 0 (p)) ;展开test 得到以下程序 (if (= 0 (p)) 0 (p)) ;对谓词(= )进行求值 (if (#t) 0 (p)) ;谓词等于真 返回0 0
这个if语句的行为很重要,实际上if发现(p)并没有被求值的必要。
如果是按应用序的话,解释器会“先对参数求值而后应用”,所以流程如下:
(test 0 (p)) ;对参数(p)求值,根据(p)的定义,解释器又得到了(p) (test 0 (p)) ;程序将不会产生有意义的输出