SICP 全笔记

这一节主要说如何创建局部状态变量。

创建局部状态变量有两种方法。一种是使用 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 能够作为局部的状态变量存在而不影响其他变量。