Allegro中的未绑定变量

时间:2016-01-11 18:30:56

标签: common-lisp allegro-cl

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

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

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

1 个答案:

答案 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的可见性。