2013-03-13 24 views
5

私はClojureを学んでいます。それでも私は言語と哲学のための良い理解 を持っていません。Clojureのドット演算子と完全修飾呼出しの違い

しかし、私はこの言語にもっと慣れたいと思っています。したがって、 私は ClojureコアAPIドキュメントを読み始め、clojure.core/getソースコードに興味深いものが見つかりました。

(defn get 
    "Returns the value mapped to key, not-found or nil if key not present." 
    {:inline (fn [m k & nf] `(. clojure.lang.RT (get ~m ~k [email protected]))) 
    :inline-arities #{2 3} 
    :added "1.0"} 
    ([map key] 
    (. clojure.lang.RT (get map key))) 
    ([map key not-found] 
    (. clojure.lang.RT (get map key not-found)))) 

特定のキーで値を取得するには、clojurelang.RT/get関数を使用します。 コードはdotオペレータ - (. clojure.lang.RT (get map key))を呼び出します。

私の質問は、 (clojure.lang.RT/get map key)の代わりに(. clojure.lang.RT (get map key))と書きました。

技術的に違いはありますか?または任意の利益?

+0

定義前に 'classname/method'構文を定義しましたか?私の推測では、 'clojure.lang.RT/get'はコンパイル時にこの時点で文法エラーになります。 – ToBeReplaced

+0

'' clojure.core''コードは、最低レベルのフォームを使用する傾向があるため、おそらく言語哲学を理解するのには良い場所ではありません。きれいなHTTP抽象化(https://github.com/mmcgrana/ring/)のためのリングや、ルーティングDSL(https://github.com/weavejester/compojure)のためのコンパイルのように、よく確立されたライブラリを見る方が良いでしょう。 – sw1nn

答えて

7

Clojureのドットはホストinterop(この場合Javaクラスclojure.lang.RT)に使用されます。静的メソッドの慣用形式は(Classname/staticMethod args*)ですが、.特別フォームの呼び出しに展開されます。 get関数の場合、基本的にClojureの実装の一部を見ています。下位レベルのClojureコードが上位レベルのマクロを使用する理由はないので、.フォームを直接使用します。彼らはドット演算子の呼び出しに展開している方法を見つけることができますhttp://clojure.org/java_interop

慣用フォームが一番上に、あなたの下に、次のとおりです。

は、ドキュメントを見てみましょう。静的メソッドに関連するビットは次のとおりです。

(Classname/staticMethod args*) ==> (. Classname staticMethod args*) 
関連する問題