我不熟悉 Let Over Lambda。
Lisp in Small Pieces 一书解释了词法绑定如何编译成非常有效的变量引用。由于对变量的所有已知引用都在有限范围内,因此您可以使用数组来存储绑定并通过数字索引引用它们,而不是使用符号来查找事物或使用符号的属性来获取价值。
传递给函数的符号只是一个符号,一种数据。将其与函数中的其他内容进行比较与访问特定范围内的词法绑定信息不同。
有一种教学 Lisp 伪 OO 技术,它展示了如何通过传入一个符号来访问和修改词法状态来更改函数行为,但它是从一组固定的已知事物中进行选择进行比较,而不是基于词法信息的任意查找在一个符号上。
(defun make-incrementor (initial-value)
(let ((value initial-value))
(lambda (action)
(ecase action
(:value
value)
(:increment
(incf value))
(:reset
(setf value initial-value))))))
> (defvar *inc* (make-incrementor 10))
*INC*
> (funcall *inc* :increment)
11
> (funcall *inc* :increment)
12
> (funcall *inc* :increment)
13
> (funcall *inc* :reset)
10
value
这是在不从外部访问它的情况下操纵 的词法绑定。所有更改都通过同一词汇位置中的代码进行调解。