在我正在阅读的书中的示例代码中,有一行宏提供了获取符号全局值的简写:
(defmacro sv (v) '(symbol-value `,v))
但是,Allegro 将 V 视为未绑定变量。我不知道如何更改此宏以返回正确的结果,因为我以前从未遇到过这样的问题。我将如何获得任何符号的全局值?谢谢你的帮助!
在我正在阅读的书中的示例代码中,有一行宏提供了获取符号全局值的简写:
(defmacro sv (v) '(symbol-value `,v))
但是,Allegro 将 V 视为未绑定变量。我不知道如何更改此宏以返回正确的结果,因为我以前从未遇到过这样的问题。我将如何获得任何符号的全局值?谢谢你的帮助!
你需要一个反引号,而不是单引号,在整个 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*))
*wombat*
形式中的是let
词法变量,而形式*wombat*
中的defparameter
是动态的。let
表单暂时隐藏defparameter
了.