gpt4 book ai didi

lisp - 动态作用域可以实现词法作用域吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:41 25 4
gpt4 key购买 nike

Old Lisp,包括某些时候的 Common Lisp 和 emacs 24.1 之前的 elisp,是动态作用域的,在我读过的资源中,共识似乎是词法作用域更适合编程。

我感觉动态作用域更容易理解。动态范围可以完全根据符号及其值来考虑。词法范围需要一个新的“绑定(bind)”概念,据我目前所知,它破坏了 Lisp 语言的一些简单/优雅。

我一直在思考如何提出这个问题,“词法作用域是否破坏了一些优雅?”更严格,我最好的想法是看看它们是否等效,即一个是否可以实现另一个。

是否有可能将词法范围的 lisp 实现为动态范围列表中的简单扩展?是否可以在解释器不引入新的特殊符号的情况下这样做?

更具体地说,创建词法范围的 let 能否在动态范围的 lisp 中实现?

最佳答案

动态作用域更容易实现,也许更容易理解,但它使代码更难阅读:

(setf y 11)

(defun add-some (x)
(+ x y))

(defun add-ten (x)
(let ((y 10))
(add-some x)))

在词法 lisp 中,您会看到 add-some 中的 y 是全局变量 y(add-ten 89) 的结果将是 100 因为 yadd-some 中是 10 并且add-10 中的本地 y 不执行任何操作。

如果它是一个动态的 Lisp,答案将是 99 并且 lambda 的主体可以引用不在全局范围内的变量。它们的结果变得神奇且难以预测。错误可能会忘记绑定(bind)它们,或者多个函数会覆盖它,因此最终结果是错误很多的软件。

在 Common Lisp 中,您有动态变量,为了不出错,可以使用 *earmuffs* 来识别它们。

在原始的 Lisp 论文中,John McCarthy 在原始的高阶函数 maplist 和他用来实现 diff< 的匿名函数中使用相同的变量 x/。结果是他的例子没有用。我们谈论的是 6 行代码,变量的重用在动态作用域语言中引入了难以发现的错误。

从动态范围的 Lisp 中创建词法 Lisp

具有动态作用域的

let 会一直存在,直到代码在其中执行完毕,并且对 let 中的变量的引用可用于所有被调用的函数,除非它们本身被覆盖。你不会得到闭包,所以如果你想在动态作用域的 lisp 中使用闭包,你需要自己制作框架。

Scheme 最初是作为解释器在动态范围的 Lisp (MacLisp) 下编写的。使用宏(也许还有阅读器宏),您可以使动态绑定(bind)的 Lisp 像词法绑定(bind)的一样工作(或相反),但它不会像一开始就被词法绑定(bind)那样高效。

关于lisp - 动态作用域可以实现词法作用域吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com