namespaces.cljc 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. (ns frontend.namespaces
  2. #?(:cljs (:require-macros [frontend.namespaces])))
  3. ;; copy from https://github.com/clj-commons/potemkin/issues/31#issuecomment-110689951
  4. (defmacro import-def
  5. "import a single fn or var
  6. (import-def a b) => (def b a/b)
  7. "
  8. [from-ns def-name]
  9. (let [from-sym# (symbol (str from-ns) (str def-name))]
  10. `(def ~def-name ~from-sym#)))
  11. (defmacro import-vars
  12. "import multiple defs from multiple namespaces
  13. works for vars and fns. not macros.
  14. (same syntax as potemkin.namespaces/import-vars)
  15. (import-vars
  16. [m.n.ns1 a b]
  17. [x.y.ns2 d e f]) =>
  18. (def a m.n.ns1/a)
  19. (def b m.n.ns1/b)
  20. ...
  21. (def d m.n.ns2/d)
  22. ... etc
  23. "
  24. [& imports]
  25. (let [expanded-imports (for [[from-ns & defs] imports
  26. d defs]
  27. `(import-def ~from-ns ~d))]
  28. `(do ~@expanded-imports)))
  29. ;; FIXME:
  30. #_(defmacro import-ns
  31. "import all the public defs from multiple namespaces
  32. works for vars and fns. not macros.
  33. (import-ns
  34. m.n.ns1
  35. x.y.ns2) =>
  36. (def a m.n.ns1/a)
  37. (def b m.n.ns1/b)
  38. ...
  39. (def d m.n.ns2/d)
  40. ... etc
  41. "
  42. [& namespaces]
  43. (let [expanded-imports (for [from-ns namespaces
  44. d ((ns-resolve 'cljs.analyzer.api 'ns-publics) from-ns)]
  45. `(import-def ~from-ns ~d))]
  46. `(do ~@expanded-imports)))