lisp 笔记 - 闭包
一般语言由 primitives 组成, lisp 由 meta-primitives 组成。lisp 不定义 primitives. “Any time there is a primitive, there is a barrier, a non-orthogonality, in the design of the system.”
let 用来创建 lexical scope.
lexical scope 的好处是这些绑定在编译后不需要为其实际分配任何内存 slot, 甚至一些显而易见的逻辑会被直接编译优化成简单的常量。
lisp 中 dynamic scope 通过 defvar 创建,类似于全局变量。dynamic scope 的变量必须在 environment 中开辟实际内存区域(runtime). 因此性能可能稍微不如 lexical scope. dynamic scope 的变量在遇到同名的 lexical scope 变量时可能被 shadow. shadow 的过程实际是在进入 lexical scope 时在 dynamic scope 的那个 environment 中先备份原来的值,然后改写该值,在退出 scope 前再次从备份中恢复原来的值。
let over lambda 是用来创建闭包的惯用法;
闭包本质是 state + 1个 function.
object 是 state + multiple functions.
在 let over lambda 结构中用 values 返回多个引用了相同 bindings 的 lambdas,可以实现 class 和 object.
let over lambda over let over lambda 可以实现 class variable (static variable).
let + lambda 的各种组合用法可以实现大多数语言中的 OO 系统特性。该组合甚至可以实现更独特的一些应用场景。抛开继承,在大多数情况下一个 OO 系统是不必要的。OO 系统是基于 let 和 lambda 的一种特定实现。