スペックから
これは、Common LispHyperSpecがネストされたバックティックについて言っていることです:
バッククォート構文がネストされている場合は、最も内側のバッククォート形式を最初に展開する必要があります。これは、複数のコンマが連続して発生する場合、左端のコンマが最も内側のバッククォートに属することを意味します。
R5RSスキームの仕様には、バックティックに関する次の詳細も含まれています。
準引用符フォームはネストできます。置換は、最も外側のバッククォートと同じネストレベルに表示されるクォートされていないコンポーネントに対してのみ行われます。ネストレベルは、連続する各準引用の内部で1ずつ増加し、各非引用の内部で1ずつ減少します。
また、通常の見積もりと同様に、評価ごとに1つのバッククォートのみが折りたたまれることを覚えておいてください。再帰的ではありません。
実行中のルール
これらの3つの詳細がどのように相互作用するかを確認するために、例を少し拡張してみましょう。この表現...
``(a ,,(+ 1 2) ,(+ 3 4))
これに評価されます(SBCL表記で):
`(A ,3 ,(+ 3 4))
- 左のバッククォートが折りたたまれたため
(+ 1 2)
、一致するコンマ(HyperSpecによると2番目のコンマ)によってエスケープされました。
- 一方、は
(+ 3 4)
展開するのに十分なコンマがありませんでした(これはR5RSが言及していることです)。
- バッククォートが再帰的に拡張されないため、1つのバッククォートのみが折りたたまれました。
両方のコンマを展開する
他のバッククォートを取り除くには、別のレベルの評価が必要です。
(eval ``(a ,,(+ 1 2) ,(+ 3 4)))
両方のバックティックがなくなり、わかりやすいリストが残ります。
(A 3 7)