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