首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lisp:为什么在引入词法范围后,“was”就失去了青睐?

Lisp:为什么在引入词法范围后,“was”就失去了青睐?
EN

Stack Overflow用户
提问于 2014-12-25 12:32:40
回答 2查看 318关注 0票数 1

在人工智能编程的范例中,彼得·诺维格( Peter )刚刚引用了一段话:

在过去,eval被认为是Lisp灵活性的关键。在具有词汇作用域的现代Lisps中,例如Common,使用率较低(实际上,在Scheme中根本不存在eval )。相反,程序员需要使用lambda创建一个新函数,然后应用或完成所有函数。

有一些考虑到了为什么eval不是一个好主意,比如this,但是我更感兴趣的是eval和动态(特殊的?)之间的交互。变量以及词汇的引入如何导致eval失宠。在引入词汇变量之前,常见的eval成语是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-26 02:33:52

不幸的是,我没有现成的引文,但据我所知,这篇文章所指的模式是模仿词汇范围的一种方式。也就是说,在词汇通用Lisp中,我们可以简单地写:

代码语言:javascript
复制
(defun constant-adder (a)
  (lambda (b) (+ a b)))

在对所有变量使用动态作用域的语言中(但使用相同的语法),可以通过构造lambda表达式来模拟词法作用域:

代码语言:javascript
复制
(defun constant-adder (a)
  (eval `(lambda (b) (+ (quote ,a) b))))

也就是说,我们正在运行时构造一个值为a的表达式,而不是让语言自动捕获a

(然而,您的话表明,也没有使用lambda。我对在那种情况下会发生的事情没有合理的解释。)

票数 1
EN

Stack Overflow用户

发布于 2014-12-25 15:08:07

eval

在当前动态环境和空词法环境中计算表单。

这意味着

代码语言:javascript
复制
(defun f (a) (eval '(1+ a)))
; warning: The variable A is defined but never used.

编译器注意到,与天真的预期相反,a没有传递给eval。的确:

代码语言:javascript
复制
(f 10)
; error: UNBOUND-VARIABLE: The variable A is unbound.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27647214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档