Guest User

Untitled

a guest
May 27th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.00 KB | None | 0 0
  1. (defmacro defhintedfn [name args & body]
  2. (let [iface (gensym "HintedFn")
  3. hname (vary-meta name assoc :tag iface)
  4. vname (vary-meta name assoc
  5. :inline (fn [& args] `(.invoke ~hname ~@args)))]
  6. `(do
  7. (definterface ~iface
  8. (~(with-meta 'invoke {:tag (:tag name Object)}) ~args))
  9. (def ~vname nil) ; workaround for a soon-to-be-fixed bug
  10. (def ~vname
  11. (reify
  12. ~iface
  13. (invoke [this# ~@args]
  14. (println "specialized")
  15. ~@body)
  16. clojure.lang.IFn
  17. (^Object invoke [this# ~@(map #(vary-meta % dissoc :tag) args)]
  18. (println "generic")
  19. ~@body))))))
  20.  
  21. (defhintedfn ^int hfib [^int n] (if (>= (int 1) n) (int 1) (+ (hfib (dec n)) (hfib (- n (int 2))))))
  22.  
  23. (comment
  24. user=> (hfib 5)
  25. specialized
  26. specialized
  27. specialized
  28. specialized
  29. specialized
  30. specialized
  31. specialized
  32. specialized
  33. specialized
  34. specialized
  35. specialized
  36. specialized
  37. specialized
  38. specialized
  39. specialized
  40. )
Add Comment
Please, Sign In to add comment