引用符を入れ子にすることはほとんど役に立ちません。逆引用符構文のコンパイラの出力で発生する可能性がありますが、ネストされたマクロであっても、そうする理由は考えられません。引用符をカスケードしている場合は、おそらく、間違った引用符解除レベルで逆引用符テンプレートに式を挿入したことを意味します。
具体的には、次のようなものを書いたとします。
````(,,,,'''''a) ;; goal is to be left with ('a) at the end of four eval rounds
しかし、ここでは、コンマと引用符は基本的にキャンセルされ、次のように実行できます。
````('a)
''''a
フォームを最も内側のバッククォートに割り当てる必要はなく、'a
複数の評価にわたって逆方向に動作させる必要はありません。最も外側のレベルに割り当てるだけ'a
で完了です。
別の例は、上記を少し変更したものです。4 回の評価ラウンドが発生することが予想されます。最後のラウンドa
では、その評価の環境にあるバインディングが置き換えられます。
````(,,,,''''a) ;; only four quotes this time
したがってeval
、上記の逆引用符の結果が 3 つ表示された後、残っている(a)
のeval
は、関数 を呼び出すことですa
。しかし、繰り返しますが、次のように同じことを達成できます。
````(a)
前とまったく同じように、3 つevals
が生成(a)
し、もう 1 つが を呼び出しますa
。
では、シンボルa
が文字どおりa
ではなく、計算されたものである場合はどうなるでしょうか? Saya
は に置き換えられb
ます:
(let ((a 'b))
````(,,,''',a))
let
置換は、逆引用符の最初の評価でb
. 結果のオブジェクトは次と同等です
```(,,,'''a)
この例では、3 つのコンマと引用符をキャンセルすることはできません。ただし、慣習的な方法は、2 つを散在させることです。
(let ((a 'b))
````(,',',',a)) ;; instead of ,,,''',a
各評価ラウンドでは、見積もりが削除されますが、その後追加されます。最初の置換は に置き換え,a
られb
ますが、引用符で保護されます。次に、次のラウンドで、その引用符の前のコンマ,'b
が に置き換えられますがb
、その前の別の引用符が再びそれを保護します。
つまり、直接合成された引用符が有用なことを行っているのを目にする可能性のある 2 つの状況は、次の 2 つ,,'',expr
です,',',expr
。不必要に複数の評価ラウンドに沈められた何らかの形式の複数の評価に対抗するために使用される複数の引用符の余分な使用。