Это просто и один из самых распространенных вопросов макроса.
(add-test g)
Теперь при расширении макроса, макрос ADD-TEST
вызывается с параметром VAR
, получая значение G
, символ.
Затем вы пытаетесь выполнить операцию со списком. Выражение обратной цитаты
`(+ ,@var)
Значение VAR
равно G
, и вы пытаетесь объединить его в список (+ ... )
. Теперь возвращаемое выражение (+ . G)
.
CL-USER 12 > (macroexpand '(add-test g))
(+ . G)
T
(+ . G)
не является допустимой формой Lisp. Это неверный исходный код.
Помните, что параметры макроса являются неоцененными исходными выражениями.
Сравните это со следующим:
CL-USER 13 > (macroexpand '(add-test (1 2 3 4)))
(+ 1 2 3 4)
T
Вы сказали: «Не могли бы вы объяснить, почему это не работает, когда переменная передается в функцию?»
Помните, ADD-TEST
это НЕ функция, это макрос. Макрос получает переданный исходный код и возвращает новую форму - эта форма затем анализируется.