变量的本地状态

时间:2014-11-02 07:13:35

标签: scheme racket let object-state

我试图完全理解变量的对象和本地状态

此代码似乎为多次调用的相同过程产生不同的结果,这意味着局部变量发生了变化:

(define new-withdraw
  (let ((balance 100))
    (lambda (amount)
      (if (>= balance amount)
          (begin (set! balance (- balance amount))
                 balance)
          "Insufficient funds"))))

对于这个其他代码,它产生相同的结果,这意味着它为每个过程调用创建一个新的局部变量:

(define (make-account)
  (let ((balance 100))
    (define (withdraw amount)
      (if (>= balance amount)
          (begin (set! balance (- balance amount))
                 balance)
          "Insufficient funds"))
    (define (deposit amount)
      (set! balance (+ balance amount))
      balance)
    (define (dispatch m)
      (cond ((eq? m 'withdraw) withdraw)
            ((eq? m 'deposit) deposit)
            (else (error "Unknown request -- MAKE-ACCOUNT"
                         m))))
    dispatch))

我的问题是:

  • 尽管使用创建局部变量,为什么它们的行为会有所不同?

  • 有没有办法可以让第二个代码作为第一个代码工作而不将balance作为make-account的参数传递?

谢谢

1 个答案:

答案 0 :(得分:2)

测试代码1:

> (new-withdraw 0)
100
> (new-withdraw 50)
50
> (new-withdraw 10)
40

测试代码2:

> (define ac (make-account))
> ((ac 'withdraw) 0)
100
> ((ac 'withdraw) 50)
50
> ((ac 'withdraw) 10)
40

因此两个代码都保持其本地状态。代码1和代码2之间的区别在于代码1仅适用于一个帐户,而代码2和#34;创建一个新帐户"在每次调用时 - 对过程的调用返回您需要绑定到变量的调度过程,然后使用如上所示。

因此,您会得到当地国家失落的印象;不是,你可能每次都在创建一个新帐户。