我不喜欢放弃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
的词汇绑定,而无需从外部访问它。所有更改都通过相同词汇位置中的代码进行调解。
我会说,pandoric let让他们能否不问他们是否应该(以及评估的顺序是......)但是可以肯定的是,您可以在'pandoric-let'中添加一个案例s'dlambda',它返回其中的所有变量名称。 – acelent