Ответ 1
Из спецификаций
Это то, что Common Lisp HyperSpec говорит о вложенных backticks:
Если синтаксис backquote вложен, сначала должна быть раскрыта самая внутренняя обратная кадровая форма. Это означает, что если несколько запятых встречаются в строке, крайняя левая часть относится к самому внутреннему кадровому кадру.
Спецификация R5RS Scheme также включает в себя эти сведения о backticks:
Квазиквазотные формы могут быть вложенными. Замены выполняются только для некотируемых компонентов, появляющихся на том же уровне вложенности, что и внешний крайний кадр. Уровень гнездования увеличивается на единицу внутри каждой последовательной квазикватации и уменьшается на единицу внутри каждой неквалификации.
Также имейте в виду, что только одна обратная сторона обрушивается на оценку, как обычная цитата, она не рекурсивна.
Правила в действии
Чтобы узнать, как взаимодействуют эти три детали, немного расширьте свой пример. Это выражение...
``(a ,,(+ 1 2) ,(+ 3 4))
Получается для этого (в нотации SBCL):
`(A ,3 ,(+ 3 4))
- Левая обратная сторона обрушилась, так что
(+ 1 2)
получил escape-запятую (запятая 2 nd согласно HyperSpec). - С другой стороны, у
(+ 3 4)
не было достаточно запятой, чтобы получить расширение (что и упоминает R5RS). - Только одна обратная сторона обрушилась, потому что обратные ссылки не рекурсивно расширяются.
Развертывание обеих запятых
Чтобы избавиться от другого обратного хода, необходим другой уровень оценки:
(eval ``(a ,,(+ 1 2) ,(+ 3 4)))
Оба backticks исчезли, и у нас остался простой список:
(A 3 7)