Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defmacro defhintedfn [name args & body]
- (let [iface (gensym "HintedFn")
- hname (vary-meta name assoc :tag iface)
- vname (vary-meta name assoc
- :inline (fn [& args] `(.invoke ~hname ~@args)))]
- `(do
- (definterface ~iface
- (~(with-meta 'invoke {:tag (:tag name Object)}) ~args))
- (def ~vname nil) ; workaround for a soon-to-be-fixed bug
- (def ~vname
- (reify
- ~iface
- (invoke [this# ~@args]
- (println "specialized")
- ~@body)
- clojure.lang.IFn
- (^Object invoke [this# ~@(map #(vary-meta % dissoc :tag) args)]
- (println "generic")
- ~@body))))))
- (defhintedfn ^int hfib [^int n] (if (>= (int 1) n) (int 1) (+ (hfib (dec n)) (hfib (- n (int 2))))))
- (comment
- user=> (hfib 5)
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- specialized
- )
Add Comment
Please, Sign In to add comment