定义过程 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 解释器对参数的求值顺序是从右到左。