Allegro 中的未绑定变量
Unbound variable in Allegro
在我正在阅读的一本书中的示例代码中,有一行宏提供 shorthand 以获取符号的全局值:
(defmacro sv (v) '(symbol-value `,v))
但是,Allegro 将 V 视为未绑定变量。我不知道如何将此宏更改为 return 正确的结果,因为我以前从未遇到过这样的问题。我如何获得任何符号的全局值?感谢您的帮助!
你需要在整个 s-exp:
前面加一个反引号,而不是单引号
(defmacro sv (v) `(symbol-value ,v))
(我知道,很难看:把你原来的s-exp中的反引号从,v
前面移开,替换掉'(symbol-value ...)
开头的单引号) .
反引号本身作用于表达式(列表),而不是单个原子。如果您键入的内容确实在书中,则可能是勘误表。
稍微好一点的sv
版本:
(defmacro sv (v) `(symbol-value (quote ,v)))
或
(defmacro sv (v) `(symbol-value ',v))
在上一个版本中,将原始代码中的反引号和单引号互换。倒数第二个版本只是为了更容易阅读。
但是,symbol-value
只查询绑定到变量的当前值。例如,此代码的计算结果为 'something-else
:
(defparameter *wombat* 123)
(let ((*wombat* 'something-else)) (sv *wombat*))
let
形式的*wombat*
是词法变量,而defparameter
形式的*wombat*
是动态的。 let
表单暂时隐藏了 defparameter
.
的可见性
在我正在阅读的一本书中的示例代码中,有一行宏提供 shorthand 以获取符号的全局值:
(defmacro sv (v) '(symbol-value `,v))
但是,Allegro 将 V 视为未绑定变量。我不知道如何将此宏更改为 return 正确的结果,因为我以前从未遇到过这样的问题。我如何获得任何符号的全局值?感谢您的帮助!
你需要在整个 s-exp:
前面加一个反引号,而不是单引号(defmacro sv (v) `(symbol-value ,v))
(我知道,很难看:把你原来的s-exp中的反引号从,v
前面移开,替换掉'(symbol-value ...)
开头的单引号) .
反引号本身作用于表达式(列表),而不是单个原子。如果您键入的内容确实在书中,则可能是勘误表。
稍微好一点的sv
版本:
(defmacro sv (v) `(symbol-value (quote ,v)))
或
(defmacro sv (v) `(symbol-value ',v))
在上一个版本中,将原始代码中的反引号和单引号互换。倒数第二个版本只是为了更容易阅读。
但是,symbol-value
只查询绑定到变量的当前值。例如,此代码的计算结果为 'something-else
:
(defparameter *wombat* 123)
(let ((*wombat* 'something-else)) (sv *wombat*))
let
形式的*wombat*
是词法变量,而defparameter
形式的*wombat*
是动态的。 let
表单暂时隐藏了 defparameter
.