Несвязанная переменная в 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,

Другие вопросы по тегам