练习 3.8

定义过程 f 的方法有无数种,以下是其中一种比较简短的定义:

;;; 8-f.scm

(define f
    (lambda (first-value)
        (set! f (lambda (second-value) 0))
        first-value))

f 在第一次被调用的时候,返回调用它的参数 first-value ,然后将 f 设置为一个无论接受什么参数都只返回 0 的过程,因此最终求值结果就由第一次调用 f 的参数决定了。

测试:

1 ]=> (load "8-f.scm")

;Loading "8-f.scm"... done
;Value: f

1 ]=> (+ (f 0) (f 1))

;Value: 1

1 ]=> (+ (f 1) (f 0))

;Value: 0

可以看出,测试所使用的 mit-scheme 解释器对参数的求值顺序是从右到左。

讨论

blog comments powered by Disqus