0

quote複数回できることに用途はありますか?

のようなものと'aは異なり、''a(quote a)は異なります(quote (quote a))

''aつまり、それが と同じ'aまたは でさえないのはなぜですか''''''''aquote与えられた引数がまだ引用されていない場合は引用し、その方法 ''''aは に評価され'aます。

質問は次のようにすべきだと思うので、それは私には間違っていると感じます:それは引用されていますか?それは何回引用されたのではありませんか?なし?一度?100回?

4

3 に答える 3

2

引用符を入れ子にすることはほとんど役に立ちません。逆引用符構文のコンパイラの出力で発生する可能性がありますが、ネストされたマクロであっても、そうする理由は考えられません。引用符をカスケードしている場合は、おそらく、間違った引用符解除レベルで逆引用符テンプレートに式を挿入したことを意味します。

具体的には、次のようなものを書いたとします。

````(,,,,'''''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。不必要に複数の評価ラウンドに沈められた何らかの形式の複数の評価に対抗するために使用される複数の引用符の余分な使用。

于 2013-04-30T19:52:41.003 に答える