2013-03-13 18 views
5

Uczę się Clojure. Nadal nie mam dobrego zrozumienia dla języka i filozofii.Różnica między operatorem kropki a pełnoprawnym nazwanym wywołaniem w Clojure

Ale chcę być bardziej obeznany z językiem. Stąd Zacząłem czytać główną dokumentację API Clojure i znalazłem kilka interesujących rzeczy w kodzie źródłowym 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)))) 

Aby uzyskać wartość z podanym kluczem, kod wykorzystuje funkcję clojurelang.RT/get. Kod wywołania operatora kropki - (. clojure.lang.RT (get map key)).

Moje pytanie brzmi: dlaczego autor napisał (. clojure.lang.RT (get map key)) zamiast (clojure.lang.RT/get map key).

Czy są jakieś różnice techniczne? czy jakieś korzyści?

+0

Czy składnia 'classname/method' została zdefiniowana przed definicją? Domyślam się, że 'clojure.lang.RT/get' będzie błędem składni w tym momencie kompilacji. – ToBeReplaced

+0

Kod 'clojure.core'' prawdopodobnie nie jest dobrym miejscem do rozpoczęcia zrozumienia filozofii języka, ponieważ zazwyczaj używa formularzy najniższego poziomu. Lepiej zajrzyj do dobrze znanych bibliotek, takich jak ring dla czystej abstrakcji HTTP (https://github.com/mmcgrana/ring/) lub compojure dla routingu DSL (https://github.com/weavejester/compojure) – sw1nn

Odpowiedz

7

Kropka w Clojure jest używana do współdziałania hosta (w tym przypadku klasa Java clojure.lang.RT). Forma idiomatyczna dla metody statycznej to (Classname/staticMethod args*), ale zostaje rozwinięta do wywołania w specjalnym formularzu .. W przypadku funkcji get zasadniczo przyglądasz się części implementacji Clojure. Nie ma powodu, dla którego kod Clojure na niższym poziomie miałby korzystać z makra wyższego poziomu - więc używa on bezpośrednio formularza ..

Spójrz na dokumentacji w: http://clojure.org/java_interop

W idiomatyczne formularze znajdują się na górze i poniżej można znaleźć w jaki sposób są one rozszerzone do rozmów na operatora dot. Oto odpowiedni bit dla metod statycznych:

(Classname/staticMethod args*) ==> (. Classname staticMethod args*) 
Powiązane problemy