Common lisp Allegro中的未绑定变量

Common lisp Allegro中的未绑定变量,common-lisp,allegro-cl,Common Lisp,Allegro Cl,在我正在阅读的一本书中的示例代码中,有一行宏提供了获取符号全局值的速记: (defmacro sv (v) '(symbol-value `,v)) 然而,Allegro将V视为一个未绑定变量。我不知道如何更改此宏以返回正确的结果,因为我以前从未遇到过这样的问题。如何获得任何符号的全局值?谢谢你的帮助 在整个s-exp之前,您需要一个反向报价,而不是一个报价: (defmacro sv (v) `(symbol-value ,v)) (我知道,很难看到:只需将原始s-exp中的后引号从,v前

在我正在阅读的一本书中的示例代码中,有一行宏提供了获取符号全局值的速记:

(defmacro sv (v) '(symbol-value `,v))

然而,Allegro将V视为一个未绑定变量。我不知道如何更改此宏以返回正确的结果,因为我以前从未遇到过这样的问题。如何获得任何符号的全局值?谢谢你的帮助

在整个s-exp之前,您需要一个反向报价,而不是一个报价:

(defmacro sv (v) `(symbol-value ,v))
(我知道,很难看到:只需将原始s-exp中的后引号从
,v
前面移动,并替换
'开头的单个引号(符号值…

反引号操作表达式(列表),而不是单个原子本身。如果你输入的内容真的在书中,那很可能是一个勘误表

略好一点的
sv

(defmacro sv (v) `(symbol-value (quote ,v)))

在上一个版本中,在原始代码中交换后引号和单引号。倒数第二个版本只是让它更容易阅读

但是,
symbol value
仅查询绑定到变量的当前值。例如,此代码的计算结果为
'something-other

(defparameter *wombat* 123)
(let ((*wombat* 'something-else)) (sv *wombat*))

let
表单中的
*wombat*
是一个词汇变量,而
defparameter
表单中的
*wombat*
是动态的。
let
表单暂时隐藏了
defparameter

的可见性,但是,如果我将全局变量X定义为'123,(sv X)则尝试获取123的值,该值不是符号。然而,如果我将x定义为y,并将y定义为123,(svx)将计算为123。但它不会在项目的其余部分起作用;同样的错误会不断出现。如果我发布sv在中使用的代码会有帮助吗?@OrangeCalx01:为您更新了答案。您上一个定义有效-我相信是文本格式问题让我对引号感到困惑和“看起来像字母上面的逗号,不像我们看到的那样。谢谢大家!@OrangeCalx01:BTW:
symbol value
只获取符号的当前绑定值,而不是它的“全局”(动态)值。
Defparameter
声明变量全局特殊,因此
let
表单中的
*wombat*
也是特殊的,其重新绑定具有动态范围。
(defparameter *wombat* 123)
(let ((*wombat* 'something-else)) (sv *wombat*))