How can I define a variable in another namespace within a function/macro in Clojure? -
i'm experimenting ns in clojure, here's try:
user=> (in-ns 'some-ns) #<namespace some-ns> some-ns=> (def aa 100) #'some-ns/aa some-ns=> (in-ns 'user) #<namespace user> user=> (= some-ns/aa 100) true user=> (= user/aa 100) compilerexception java.lang.runtimeexception: no such var: user/aa, compiling:(no_source_path:5:1) ;this works expected user=> (defn function [] (in-ns 'some-other-ns) (def cc 100) (in-ns 'user)) #'user/function user=> (function) #<namespace user> user=> (= some-other-ns/cc 100) compilerexception java.lang.runtimeexception: no such var: some-other-ns/cc, compiling:(no_source_path:8:1) user=> (= user/cc 100) true i'm confused, why doesn't work in function? also, tried following:
user=> (binding [*ns* (create-ns 'some-a-ns)] (def dd 100)) #'user/dd user=> (= some-a-ns/dd 100) compilerexception java.lang.runtimeexception: no such var: some-a-ns/dd, compiling:(no_source_path:11:1) user=> (= user/dd 100) true according clojure doc
creates , interns or locates global var name of symbol , namespace of value of current namespace (*ns*).
what i'm missing?
ps. know can use (intern 'some-ns 'a 100), want generic function/macro
(with-ns 'some-ns (def 100)) (= some/a 100)
intern correct solution , can use in functions / macros of own. (functions can call intern; macros can expand code calling intern.)
def should ever used directly @ top level or nested within top-level forms executed top-level form is. so, def in let fine, def inside function not.
def receives special handling compiler in vars defined def forms actual created def compiled; initial bindings specified in def forms installed, however, if , when flow of control reaches def form. explains why binding example doesn't work -- compile-time value of *ns* counts, while binding introduced binding form come effect @ run time.
finally, if absolutely insist on using def forms create vars @ runtime, way eval:
(binding [*ns* some-ns] (eval '(def foo 1))) ;; some-ns/foo comes existence root binding of 1 note here def occur @ top-level , executed after compilation.
Comments
Post a Comment