2022-12-22 00:21
我们从一个例子开始.
像counter这样的过程被有的人称之为let over lambda, 甚至有一本书以此为标题. 有的人喜欢称counter这样的过程为闭包, 但是实际上在概念上每个Scheme过程都是闭包. 有的人可能反对我的说法, 因为他们将闭包视为特定的实现技术, 但是那的确也是从概念上理解Scheme过程的正当做法.
一个闭包由过程的代码和创建过程所在的环境组成. 没有更多了. 这个名字理解起来是十分简单的, 也就是说, 过程的代码本身可能不是封闭的, 因为其可能含有自由变量, 但是通过将创建过程所在的环境容纳于考虑的范围之内, 过程就成为了封闭形式. 显然, 在实际的实现中, 并不需要保存整个环境, 只需要保存自由变量就够了.
counter见过以后, 让我们看看它的亲戚make-counter.
像make-counter这样的过程也被称为lambda over let over lambda, 原因也是显然的. 在对于(make-counter)求值时, x和0之间的绑定先被创建, 但是每次求值时的绑定也是不同的, 所以由make-counter创建的不同的counter之间不会相互干扰.
let over lambda式的过程常被称为「对象」, 这里的对象应该理解为带有局部状态的过程, 而且这个对象也与面向对象中的对象有关, 正所谓「闭包是穷人的对象, 对象是穷人的闭包」. 至于面向对象的本体论问题, 这不在我们书中交代. 对于Lisper/Schemer而言, 另一个重要的观念是对象之间通过「消息」进行交互, 我们之后再说.