Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
29 lines (20 sloc) 1.53 KB
(define (make-account initial-amount)
  (let ((balance initial-amount))
    (lambda (amount)
      (if (> balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))))

上面这个过程,多了一个let,let其实就是匿名函数调用的语法糖衣,在创建这个匿名过程时,会创建一个新环境E1,紧接着执行let里面的lambda表达式,它又会创建一个匿名过程,所以就又会创建个新环境,称为E2,并且指向E1。

当创建W2时,如下

图片截取自(需翻墙):

其实这里只要把过程在声明时与调用时所做的事情弄清楚就OK了。

  • 函数在声明时(通过define或匿名),生成一个pair,(car pair)为函数体,(cdr pair)为一个指针,指向声明时所在的环境
  • 函数在调用时,新创建一个环境,实际传入的参数与形参在这里形成绑定,并且这个新生产的环境指向函数声明时(cdr pair)所指向的环境。
  • 匿名函数的声明与调用一般是一起的。

我用 Java 实现了个 Scheme 的方言,其中关于环境创建一开始也没想好怎么处理,后来明白了上面两个就很简单了。具体实现可以参考 SFunction.java 的apply方法。重点参考环境的指向是怎么形成的。