Primitive functions only work (e.g. return primitive types) when defined with defn
. An equivalent function created with fn
does not behave the same way as when created with defn
. For example:
(definterface IPrimitiveTester
(getType (link: ^int x))
(getType (link: ^long x))
(getType (link: ^float x))
(getType (link: ^double x))
(getType (link: ^Object x)))
(deftype PrimitiveTester (link: )
IPrimitiveTester
(getType (link: this ^int x) :int)
(getType (link: this ^long x) :long)
(getType (link: this ^float x) :float)
(getType (link: this ^double x) :double)
(getType (link: this ^Object x) :object))
(defmacro pt (link: x)
`(.getType (PrimitiveTester.) ~x))
(defn with-defn ^double (link: ^double x)
(+ x 0.5))
(pt (with-defn 1.0)) ; => :double
(let (link: a (fn ^double [^double x) (+ x 0.5))]
(pt (a 0.1))) ; => :object
Please see the discussion on the mailing list for more details and thoughts on what is happening:
http://groups.google.com/group/clojure/browse_thread/thread/d83c8643a7c7d595?hl=en