Несвязанная переменная в Allegro
В коде примера в книге, которую я читаю, есть строка для макроса, которая обеспечивает сокращение для получения глобального значения символа:
(defmacro sv (v) '(symbol-value `,v))
Тем не менее, Allegro видит V как несвязанную переменную. Я не знаю, как изменить этот макрос, чтобы он возвращал правильный результат, потому что я никогда раньше не сталкивался с подобной проблемой. Как бы я получить глобальное значение любого символа? Спасибо за вашу помощь!
1 ответ
Вам нужна обратная кавычка, а не одна кавычка, перед всем 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
,