2013-06-02 13 views
5

(car ''abracadabra)(car (quote (quote abracadabra))に相当し、それは(car (quote abracadabra))と評価された - 私には直感的に理にかなって(car (quote (a b)))aと評価さオット手、ON>quoteスキームはいつ見積もりを評価しますか?

は、だから私の質問は、なぜスキームは(すなわち(car abracadabra)から(car (quote abracadabra))を評価する)(car (quote (quote abracadabra))で二重引用符を評価しませんが、(car (quote (a b)))に引用符をevaluadeん(つまり、なぜ答えquoteではありませんか)?

答えて

9

:インナーquoteは評価されません

(car (quote (quote abracadabra))) 
=> 'quote 

、それは不特定の意味で、ちょうどシンボルです。

(car (quote (foobar abracadabra))) 
=> 'foobar 

引用符で囲まれた式の中で、他の式は評価されません。スキームは、それはオペレータが評価の組み合わせを評価するとき

(car (quasiquote (unquote (quote abracadabra)))) ; (car `,(quote abracadabra)) 
=> car: contract violation expected: pair? given: 'abracadabra 

(car (quasiquote (unquote (foobar abracadabra)))) ; (car `,(foobar abracadabra)) 
=> foobar: unbound identifier in module in: foobar 
2

スキームは、内部見積もりが外部見積もり内にあり、見積り内の式が評価されないため、内部見積もりを評価しません。つまり、(quote foo)と書くと、fooは評価されません。fooquoteの別の呼び出しであっても、評価されることはありません。この式で

1

:私たちは今、これはそれぞれのケースごとに異なるエラーになり、内部の引用を評価しようとし、評価を強制的にquasiquotingを使用することができます。それが特殊なフォームかマクロの場合は、それが適用されます。そうでない場合は、適用前に各オペランドを評価します。車は#<のproc車>と評価さ

  • *このよう

    (car (quote (quote abracadabra))) 
    

    を評価することができます。それは手順がありますので、

  • (引用(引用アブラカダブラ))の組み合わせがあり、これ
    • 引用が評価される=>#<マクロ引用>とそのマクロ/特殊な形ので、マクロ行う任意の順序ですべてのオペランドを評価します適用
    • 適用するマクロ(#<マクロ引用>(引用アブラカダブラ)))=>(引用アブラカダブラ)
  • 適用-PROC(#< PROC車>(引用アブラカダブラ))=>引用

*実際には、スキームはキーワードをシャドーすることができるので、コンテキストは非常に重要です。例:

(let ((quote list) (abracadabra 'simsalabim)) 
    (car (quote (quote abracadabra)))) 
==> (simsalabim) 
関連する問題