Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between dot operator and fully qualified named call in Clojure

Tags:

clojure

I'm learning Clojure. Still I have no good understanding for the language and the philosophy.

But I want to be more familiar with the language. Hence I have started to read Clojure core API documentation and found some interesting stuffs in clojure.core/get source code.

(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 ~@nf)))
   :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))))

To get a value with given key the code uses clojurelang.RT/get function. The code calls dot operator - (. clojure.lang.RT (get map key)).

My question is why the author wrote (. clojure.lang.RT (get map key)) instead of (clojure.lang.RT/get map key).

Is there any technical difference? or any benefit?

like image 812
popopome Avatar asked Mar 13 '13 01:03

popopome


1 Answers

The dot in Clojure is used for host interop (with the Java class clojure.lang.RT in this case). The idiomatic form for a static method is (Classname/staticMethod args*) but that gets expanded into a call on the . special form. In the case of the get function, you're essentially looking at a part of Clojure's implementation. There's no reason why the lower-level Clojure code would use the higher level macro - so it uses the . form directly.

Take a look at the documentation at: http://clojure.org/java_interop

The idiomatic forms are at the top and below you can find how they're expanded into calls on the dot operator. Here's the relevant bit for static methods:

(Classname/staticMethod args*) ==> (. Classname staticMethod args*)
like image 57
sethev Avatar answered Oct 31 '22 23:10

sethev