Hello -

The documentation specifies that 'def' and 'intern' have the same behavior 
with regards to metadata on the Var they define/intern. So I expected these 
to be equivalent:

(def ^:dynamic my-var)

(intern *ns* (with-meta 'my-var {:dynamic true}))

Indeed, (meta #'my-var) correctly show :dynamic true in either case.

However,

(binding [my-var :foo] my-var)

throws an exception in the case of intern usage, complaining that the Var 
is non-dynamic.

The analysis of Clojure source reveals that 
clojure.lang.Var/pushThreadBindings checks a member isDynamic, rather than 
the metada itself. Which is understandable from the performance point of 
view. Problem is the Var's property isDynamic is set by 'def' special form 
only, while 'intern' doesn't do it.

Am I correct in thinking that either the doc needs to be updated to reflect 
a special status of 'def' in regard to dynamic Vars, or 'intern' has a bug?

I personally think its a bug in 'intern'. It can be circumvented by using 
Java interop on the Var, like (.setDynamic #'my-var) after interning it, 
but it looks ugly.

The reason I stumbled on it is I need to intern a dynamic Var in a macro, 
and using 'def' in a macro doesn't seem to quite work with metadata - it's 
apparently being processed by the reader at a wrong time (maybe I'm missing 
something, but that's a question for another day.) I tried to use 'intern' 
instead and hit the problem described above.

Cheers.........................Yuri

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to