0

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

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

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

4

1 回答 1

2

你需要一个反引号,而不是单引号,在整个 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了.

于 2016-01-11T18:45:17.177 回答