Вывод, который вы хотите получить, имеет несбалансированные запятые.,@
уже балансирует обратную цитату, поэтому вы не можете иметь ,SOME
и ,EL
.Это два уровня отмены цитирования / объединения внутри только одного уровня обратного цитирования.
Я подозреваю, что вы хотите:
`(WITH-GENSYMS (EL) ... (LET (,@(BUILD-BIND 'SOME EL)) ...))
Символ some
входит в качестве аргумента для исходного макроса и имеетзаканчиваться символом в кавычках при передаче функции build-bind
.EL
оценивается прямо.Это просто локальная переменная, введенная связывающей конструкцией WITH-GENSYMS
, и она больше не находится в контексте обратной кавычки, потому что она находится внутри сращивания.
Транслитерация этого обратно в обратную цитату исходного внешнего макроса: SOME
становится,name
:
,@(build-bind ',name el) ;; two commas out balance two backquotes in
Символ сплайсинг дин под зонтиком защитной цитаты, которая будет гарантировать, что он рассматривается как символ, а не как переменная.
el
не нуждается в сращивании;это не переменный материал, а жестко запрограммированная особенность создаваемого шаблона.Если бы вы поместили ,el
, он бы искал переменную el
в области видимости макроса define-term-construct
, где такой вещи не существует.