2013-03-13 6 views
5

Sto imparando Clojure. Ancora non ho capito bene per la lingua e la filosofia.Differenza tra operatore punto e chiamata con nome completo in Clojure

Ma voglio essere più familiare con la lingua. Quindi Ho iniziato a leggere la documentazione dell'API core Clojure e ho trovato alcuni elementi interessanti nel codice sorgente 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)))) 

per ottenere un valore con data chiave il codice utilizza clojurelang.RT/get funzione. Il codice chiama operatore punto - (. clojure.lang.RT (get map key)).

La mia domanda è perché l'autore ha scritto (. clojure.lang.RT (get map key)) anziché (clojure.lang.RT/get map key).

C'è qualche differenza tecnica? o qualche beneficio?

+0

La sintassi 'classname/method' è stata definita prima della definizione? La mia ipotesi sarebbe che 'clojure.lang.RT/get' sarebbe un errore di sintassi a questo punto della compilazione. – ToBeReplaced

+0

Il codice '' clojure.core'' probabilmente non è un buon punto di partenza per comprendere la filosofia del linguaggio, perché tende a utilizzare le forme di livello più basso. Sarai più interessato a librerie consolidate come ad esempio ring per un'astrazione HTTP pulita (https://github.com/mmcgrana/ring/) o compojure per un DSL di routing (https://github.com/weavejester/compojure) – sw1nn

risposta

7

Il punto in Clojure viene utilizzato per l'interoperabilità dell'host (con la classe Java clojure.lang.RT in questo caso). La forma idiomatica per un metodo statico è (Classname/staticMethod args*) ma viene espansa in una chiamata sul modulo speciale .. Nel caso della funzione get, stai essenzialmente esaminando una parte dell'implementazione di Clojure. Non c'è motivo per cui il codice Clojure di livello inferiore utilizzi la macro di livello superiore, quindi utilizza direttamente il modulo ..

Date un'occhiata alla documentazione all'indirizzo: http://clojure.org/java_interop

Le forme idiomatiche sono in cima e sotto di voi riesce a trovare come sono espansi in invita l'operatore punto. Ecco il bit rilevante per i metodi statici:

(Classname/staticMethod args*) ==> (. Classname staticMethod args*) 
Problemi correlati