I have come up with a solution to a problem I don't think exists outside of
my mind, but since I can't for the life of me figure out how Clojure
'wants' me to do this, I thought I would bounce this off the Google Group.
*The scenario:* I am trying to collect a bunch of functions and macros from
all the different namespaces in my library into a single namespace; let's
call the namespace adams-lib.api. The idea is that the consumer of the
library will only have to include that one API namespace, and not all of
the little namespaces with parts of the functionality.
*The problem:* Obviously, calling (use) doesn't cut it, because the aliased
vars are not immigrated by subsequent calls to the (use) of the namespace
that (used) them. You know what I mean.
*The "solution": *For functions this is simpler, but macros pose some
additional challenges, which is why I'm including my "solution" for
immigrating macros. Hold on to your hats, this one is ugly:
(defmacro immigrate-macro
[ns-sym macro-sym]
`(let [ nspublics# (ns-publics '~ns-sym)
macro-var# (nspublics# '~macro-sym)
macro-fn# @macro-var#
macro-meta# (meta macro-var#)]
(def ~macro-sym macro-fn#)
(. (var ~macro-sym) (setMacro))
(reset-meta! (var ~macro-sym) macro-meta#))
nil)
And using it:
(immigrate-macro adams-lib.some-other-ns some-macro)
There has got to be a simpler/better/less insane way of doing this. Would
anyone care to weigh in? For the record, I fully realize that my solution
is not OK.
-Adam
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en