SICP章3.1 / 3.2:为变量分配对象的参数值

时间:2019-11-17 20:03:46

标签: scheme sicp

(上下文:SICP第3.1 / 3.2章)。下面是一个简单的“计数器”对象。当然,在常规代码中,您将摆脱v,并在initial-value过程中将其替换为count。但是进行实验时,我注意到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

1 个答案:

答案 0 :(得分: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