gpt4 book ai didi

common-lisp - 当我在 LISP 中使用普通的 setf 语句时会发生什么?

转载 作者:行者123 更新时间:2023-12-04 02:51:15 25 4
gpt4 key购买 nike

我知道当你想在 Lisp 中进行动态/全局绑定(bind)时,你可以使用 defparameter 或 defvar。我还知道,你可以使用 defun 参数列表或 let 语句来进行词法绑定(bind),嗯,几乎无处不在。

我想知道的是,当我在代码中的其他任何地方没有声明或使用 x 这样的语句时,我到底做了什么:

(setf x 10 )

这似乎工作正常,并且 x 似乎不像词法变量。它实际上是一个动态的全局变量,就像我使用 defparameter 或 defvar 一样,还是完全不同?

最佳答案

它的实际作用在 ANSI Common Lisp 标准中未指定。

一般来说,我更喜欢任何 CL 实现来设置动态绑定(bind)值或全局值。它不应该做任何其他事情。默认情况下,CMUCL 似乎认为将符号声明为特殊是个好主意。但这是个坏主意,因为没有明显的方法可以摆脱全局特别声明。

所以,通常我会期待这样的事情(这里是 LispWorks):

CL-USER 66 > (defun foo () (setf x44 10))
FOO

全局变量仍然未绑定(bind):
CL-USER 67 > x44

Error: The variable X44 is unbound.
1 (continue) Try evaluating X44 again.
2 Specify a value to use this time instead of evaluating X44.
3 Specify a value to set X44 to.
4 (abort) Return to level 0.
5 Return to top loop level 0.

Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.

CL-USER 68 : 1 > :top

让我们调用函数:
CL-USER 69 > (foo)
10

现在它具有全局值(value):
CL-USER 70 > x44
10

但是变量没有被声明为特殊的(因为它会被 DEFVARDEFPARAMETER 声明)。这里建立了一个词法绑定(bind)。
CL-USER 71 > (let ((x44 20)) (foo) x44)
20

当我们将局部变量声明为特殊时,我们的函数会更改绑定(bind):
CL-USER 72 > (let ((x44 20)) (declare (special x44)) (foo) x44)
10

关于common-lisp - 当我在 LISP 中使用普通的 setf 语句时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14038714/

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