SICP 通道3.1/ 3.2:为变量分配对象的参数值
SICP Ch. 3.1/ 3.2: Assigning a variable an object's parametric value
(上下文:Ch. 3.1/3.2 SICP)。下面是一个简单的 'counter' 对象。在正常代码中,您当然会在 count
过程中去掉 v
并将其替换为 initial-value
。但是通过实验,我注意到 v
不受 set!
的影响,为什么会这样?我才刚刚开始使用程序的环境模型,但我无法理解这种行为。
(define (make-counter initial-value)
(define v initial-value) ; is not affected by set! Why?
(define count
(lambda () (begin (set! initial-value (+ v 1))
v)))
(define (dispatch m)
(cond ((eq? m 'count) (count))))
dispatch)
(define A1 (make-counter 0))
(A1 'count) ---> 0 ; expected ---> 0
(A1 'count) ---> 0 ; expected ---> 1
它不起作用,因为initial-value
只是一个指示计数器初始值的参数。您需要设置的值是 v
,它保存当前计数器值,如下所示:
(define (make-counter initial-value)
(define v initial-value)
(define (count)
(define prev v)
(set! v (+ v 1))
prev)
(define (dispatch m)
(cond ((eq? m 'count) (count))))
dispatch)
现在它按预期工作了:
(define A1 (make-counter 0))
(A1 'count)
=> 0
(A1 'count)
=> 1
(上下文:Ch. 3.1/3.2 SICP)。下面是一个简单的 'counter' 对象。在正常代码中,您当然会在 count
过程中去掉 v
并将其替换为 initial-value
。但是通过实验,我注意到 v
不受 set!
的影响,为什么会这样?我才刚刚开始使用程序的环境模型,但我无法理解这种行为。
(define (make-counter initial-value)
(define v initial-value) ; is not affected by set! Why?
(define count
(lambda () (begin (set! initial-value (+ v 1))
v)))
(define (dispatch m)
(cond ((eq? m 'count) (count))))
dispatch)
(define A1 (make-counter 0))
(A1 'count) ---> 0 ; expected ---> 0
(A1 'count) ---> 0 ; expected ---> 1
它不起作用,因为initial-value
只是一个指示计数器初始值的参数。您需要设置的值是 v
,它保存当前计数器值,如下所示:
(define (make-counter initial-value)
(define v initial-value)
(define (count)
(define prev v)
(set! v (+ v 1))
prev)
(define (dispatch m)
(cond ((eq? m 'count) (count))))
dispatch)
现在它按预期工作了:
(define A1 (make-counter 0))
(A1 'count)
=> 0
(A1 'count)
=> 1