Guest User

Untitled

a guest
May 23rd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.96 KB | None | 0 0
  1. (defn tramp-fn [f]
  2. (if (fn? f)
  3. (fn [& args] #(apply f args))
  4. f))
  5.  
  6. (defn tramp-fn2 [f]
  7. (if (fn? f) (partial trampoline f) f))
  8.  
  9. (defmacro letrec [bindings & body]
  10. (let [bcnt (quot (count bindings) 2)
  11. arrs (gensym "bindings_array")
  12. arrv `(make-array Object ~bcnt)
  13. bprs (partition 2 bindings)
  14. bssl (map first bprs)
  15. bsss (set bssl)
  16. bexs (map second bprs)
  17. arrm (zipmap bssl (range bcnt))
  18. btes (map #(prewalk (fn [f]
  19. (if (bsss f)
  20. `(tramp-fn (aget ~arrs ~(arrm f)))
  21. f))
  22. %)
  23. bexs)]
  24. `(let [~arrs ~arrv]
  25. ~@(map (fn [s e]
  26. `(aset ~arrs ~(arrm s) ~e))
  27. bssl
  28. btes)
  29. (let [~@(mapcat (fn [s]
  30. [s `(tramp-fn2 (aget ~arrs ~(arrm s)))])
  31. bssl)]
  32. ~@body))))
Add Comment
Please, Sign In to add comment