在我正在阅读的一本书中的示例代码中,有一行宏提供了获取符号全局值的简写:
(defmacro sv (v) '(symbol-value `,v))
但是,Allegro将V视为未绑定的变量。我不知道如何更改此宏以返回正确的结果,因为我以前从未遇到过这样的问题。我如何获得任何符号的全局价值?谢谢你的帮助!
答案 0 :(得分:2)
在整个s-exp前面需要一个反引号,而不是单引号:
(defmacro sv (v) `(symbol-value ,v))
(我知道,很难看到:只需在,v
前面移动原始s-exp中的反引号,并替换'(symbol-value ...)
开头的单引号
Backquote本身就是表达式(列表),而不是单个原子。如果您输入的内容实际上在书中,则可能是错误的。
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
的可见性。