变量的本地状态(Local state of a variable)

2019-10-21 04:59发布

我想充分了解他们的变量的对象和当地州

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

(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

谢谢

Answer 1:

测试代码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“创建一个新帐户”每次通话 - 在调用程序返回需要绑定到一个变量的调度程序,并然后如上所示使用。

因此,你得到的印象是当地的状态丢失; 它不是,你可能每次创建新帐户。



文章来源: Local state of a variable