2013-07-23 9 views
26

私はClojureにはかなり新しく、Clojureのアポストロフィとバックティックの違いを完全に理解しているかどうかはわかりません。私が間違っている場合Clojure - '(アポストロフィ)と `(バックティック)の違い

(def x 5) 

;; Question 1 
(+ x x) ;; evaluates to 10 
'(+ x x) ;; evaluates to (+ x x) 
`(+ x x) ;; evaluates to (clojure.core/+ user/x user/x) 

;; Question 2 
`(~+ ~x ~x) ;; evaluates to (#<core$_PLUS_ [email protected]> 5 5) 
  1. は私を修正して、バッククォート記号は彼らのVARのに解決することを可能にするのに対し、そのアポストロフィが、それぞれのVARのに解決からすべてのシンボル(すなわち+およびX)を防ぐように思えます(ただし、var内の値は評価されません)。これは正確ですか?
  2. ここでは引用符(〜)で正確に何をしていますか? varを実際の値に評価していますか(つまり、関数オブジェクトの+シンボルと数値オブジェクトのxシンボル)?これをClojureのREAD-COMPILE-EVALの段階で説明できれば、それも役立ちます。

答えて

22

'でコレクションを引用すると、シンボル名は入力時に正確に引用されます。

'(+ x x) 
=> (+ x x) 
(map namespace *1) 
=> (nil nil nil) 
'(bingo/+ lara/y user/z) 
=> (bingo/+ lara/y user/z) 
(map namespace *1) 
=> ("bingo" "lara" "user") 

バックティックでコレクションを引用すると、各シンボルの名前空間が検索されます。見つからない場合は、現在の名前空間を使用します。名前空間を指定すると、修飾された名前空間を持つ'と同じように動作します。

`(+ x x) 
= > (clojure.core/+ user/x user/x) 
(map namespace *1) 
=> ("clojure.core" "user" "user") 

あなたは、単に引用符で囲まれていないだろう`内部~フォームを使用しています。これは、マクロが定義されている名前空間のシンボルと、その名前空間が使用されている名前空間のシンボルを使用するマクロの構築に役立ちます。

`(+ ~'x x) 
=> (clojure.core/+ x user/x) 
`(+ ~x x) 
=> (clojure.core/+ 3 user/x) 

最後に、スプライシングされた引用された物のコレクション全体を引用符で囲むことはできません。

`(+ [email protected]`(x x)) 
=> (clojure.core/+ user/x user/x) 

両方x ESは名前空間修飾シンボルのリストとして渡されている可能性があり、別のリストにスプライスされていたであろう参照してください。バッククォートで引用されたコレクションの外側には~または[email protected]を使用できません。

+1

ニースの答え。あなたは深く掘るしたい場合に優れたブログの記事はここにあります:https://blog.8thlight.com/colin-jones/2012/05/22/quoting-without-confusion.html –

+1

はKLIPSEのhttpで暮らすすべての人々の例を参照してください。 //app.klipse.tech/?cljs_in=(ns%20my.ns)%0A%0A%5B%0A%20%20 '(%2B%20x%20x)%20%0A%20%20%60( %2B%20%20%60%%2B%20%20%60%%2B%20%20%60% ))%0A%5D%0A – viebel

2

逆引用符は、Clojureの構文見積もりです(http://clojure.org/readerの説明を参照してください)。

`(〜+〜x〜x)は、レキシカル環境を参照できるリストを生成するフォームに展開されます。コンパイラはこのコードをコンパイルします。見てみましょうどのような `(〜+〜X〜x)の引用でそれを先頭に追加、次のように拡張されます

user=> '`(~+ ~x ~x) 
(clojure.core/seq (clojure.core/concat (clojure.core/list +) (clojure.core/list x) (clojure.core/list x))) 

あなただけの代わりに、テキストエディタでこのフォームを挿入した場合、`(〜+〜X〜X)、それを+関数と2つのxを持つリストを構築します。したがって、 `(〜+〜x〜x)は特定の構造体のリストを構築するClojureコードに展開されます。

Backquoteは、Clojureデータ(リスト、配列など)のテンプレート言語の一種です。

+0

「構文見積もり」は実際には何を意味していますか? – wmock

+0

これはClojureのドキュメントの単なる言葉です。 も参照してくださいhttp://stackoverflow.com/questions/3704372/how-does-clojures-syntax-quote-work – monoid

+3

これは引用符を意味しますが、最初に解決されたシンボルを持つ: '+はちょうど' + 'を意味しますが、\ '+ 'クロージャー。あなたが(def + rest)と言った場合、\ '+は 'user/+'になりますので、シンボルが環境で解決するものです – Hendekagon

関連する問題