(ns testcomp)
(var-get (or (ns-resolve *ns* 'foo)
             (intern *ns* 'foo :foo)))
;; foo                       ;(1)
;; (println foo)             ;(2)
;; (do foo 3)                ;(3)
;; (fn [] foo)               ;(4)
;; ((fn [] foo))             ;(5)
;; ((fn [] (println foo)))   ;(6)

With (1)-(6) all commented out, behaviour is as expected: you can
compile and use testcomp, and foo is bound to :foo.

With any of (1)-(3) uncommented, you can use testcomp with no problems
as long as it's uncompiled. If you compile it and subsequently attempt
to use it, you get an ExceptionInInitializerError caused by an
IllegalStateException due to Var testcomp/foo being unbound. What
seems to be happening (according to my limited understanding of
compilation) is that testcomp__init.class contains a reference to foo
which causes it to be interned (but unbound) before the body code is
run. ns-resolve then sees this Var, returns it, and var-get raises an
exception.

With (1)-(3) commented out, (4)-(6) can be uncommented and expected
behaviour returns. testcomp__init.class no longer contains a reference
to foo (I checked with grep).

I'm doing something like this in a library, and (5)/(6) provide a
workaround, but is this something that can be fixed at the language
level? I recognise it's not an issue that will commonly be run into,
and that the complexities of compilation might make it unavoidable.

java version "1.6.0_14", clojure commit
5f1e6ed540eab11281b7bfb19f831b7e445ed0d0 (1 Sep 09).
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to