这一节主要说如何创建局部状态变量。
创建局部状态变量有两种方法。一种是使用 let 与 lambda 来搭配定义一个过程:
(define new-withdraw
(let ((balance 100))
(lambda (amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))))
另一种,是使用过程的参数来作为局部状态变量。
(define (make-withdraw balance)
(lambda (amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds")))
这两种方法的共同点,都是需要返回一个 lambda 式。
从编程语言的角度来说,这个 lambda 式其实是创建了一个闭包 (closure)。这个闭包包括 lambda 式子,lambda 的参数,以及一份当前环境 (environment)中的变量与函数信息的拷贝。当 (lambda (amount) ... ) 创建的时候,balance 已经被放到了当前的 environment 里面。所以上面两个例子中的 balance 能够作为局部的状态变量存在而不影响其他变量。