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.

的可见性