在人工智能编程的范例中,彼得·诺维格( Peter )刚刚引用了一段话:
在过去,eval被认为是Lisp灵活性的关键。在具有词汇作用域的现代Lisps中,例如Common,使用率较低(实际上,在Scheme中根本不存在eval )。相反,程序员需要使用lambda创建一个新函数,然后应用或完成所有函数。
有一些考虑到了为什么eval不是一个好主意,比如this,但是我更感兴趣的是eval和动态(特殊的?)之间的交互。变量以及词汇的引入如何导致eval失宠。在引入词汇变量之前,常见的eval成语是什么?
发布于 2014-12-26 02:33:52
不幸的是,我没有现成的引文,但据我所知,这篇文章所指的模式是模仿词汇范围的一种方式。也就是说,在词汇通用Lisp中,我们可以简单地写:
(defun constant-adder (a)
(lambda (b) (+ a b)))在对所有变量使用动态作用域的语言中(但使用相同的语法),可以通过构造lambda表达式来模拟词法作用域:
(defun constant-adder (a)
(eval `(lambda (b) (+ (quote ,a) b))))也就是说,我们正在运行时构造一个值为a的表达式,而不是让语言自动捕获a。
(然而,您的话表明,也没有使用lambda。我对在那种情况下会发生的事情没有合理的解释。)
发布于 2014-12-25 15:08:07
eval
在当前动态环境和空词法环境中计算表单。
这意味着
(defun f (a) (eval '(1+ a)))
; warning: The variable A is defined but never used.编译器注意到,与天真的预期相反,a没有传递给eval。的确:
(f 10)
; error: UNBOUND-VARIABLE: The variable A is unbound.https://stackoverflow.com/questions/27647214
复制相似问题