Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme SICP第3.1/3.2章:将变量指定为对象';s参数值_Scheme_Sicp - Fatal编程技术网

Scheme SICP第3.1/3.2章:将变量指定为对象';s参数值

Scheme SICP第3.1/3.2章:将变量指定为对象';s参数值,scheme,sicp,Scheme,Sicp,(上下文:第3.1/3.2章SICP)。下面是一个简单的“计数器”对象。在普通代码中,您当然会在count过程中去掉v并用初始值替换它。但是在实验中,我注意到v不受set的影响为什么会这样?我刚刚开始介绍程序的环境模型,但我对这种行为没有多大意义 (define (make-counter initial-value) (define v initial-value) ; is not affected by set! Why? (define count (lambda

(上下文:第3.1/3.2章SICP)。下面是一个简单的“计数器”对象。在普通代码中,您当然会在
count
过程中去掉
v
并用
初始值
替换它。但是在实验中,我注意到
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

它不起作用,因为
初始值
只是一个指示计数器初始值的参数。需要设置的值是
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