41

私は 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_ clojure.core$_PLUS_@32ee28a9> 5 5)
  1. 間違っている場合は訂正してください。ただし、アポストロフィはすべての記号 (つまり + と x) がそれぞれの var に解決されるのを防ぎますが、バッククォートは記号がそれらの var に解決されることを許可します (ただし、値には評価されません)。変数内)。これは正確ですか?
  2. ここで引用符解除記号 (~) は正確に何をしますか? var を実際の値に評価していますか (つまり、+ 記号を関数オブジェクトに、x 記号を数値オブジェクトに)? Clojure の READ-COMPILE-EVAL フェーズでこれを説明できれば、それも役に立ちます。
4

2 に答える 2

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 コードに展開されます。

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

于 2013-07-23T03:56:10.807 に答える