Why is the following code throwing an exception?
PushbackReader rdr = new PushbackReader( new StringReader( "(in-ns
'user)" ) );
Object input = LispReader.read(rdr, false, null, false );
clojure.lang.Compiler.eval( input );
java.lang.IllegalStateException: Can't change/establish root binding
of: *ns* with set
at clojure.lang.Var.set(Var.java:170)
at clojure.lang.RT$1.invoke(RT.java:206)
at clojure.eval__2237.invoke(Unknown Source)
at clojure.lang.Compiler.eval(Compiler.java:3847)
...
I'm trying to set the namespace so that subsequent expressions are
evaluated within it.
Have a look in jvm/clojure/lang/Repl.java which demonstrates creating
and entering the 'user namespace.
The key is that you need to wrap the call to in-ns in
Var.pushThreadBindings(IPersistentMap) / Var.popThreadBindings().
This is analogous to:
(binding [*ns* *ns*] ;; bind a thread-local copy of *ns* so changes
are isolated to this thread
(....))
See also:
http://clojure.org/vars
The root binding of Clojure vars are immutable, but using the
(binding) construct you can override the value within the scope of the
(binding) form.
The clojure/*ns* var is no different and this is why you see Repl.java
establishes a thread-local binding before evaluating user code. This
allows you to change the namespace at the REPL.
Hope this helps.
/mike.
Thanks, Mike! Works perfectly! (btw, only on Java 1.5 and not on 1.6.
On 1.6 there's a problem with arguments to RT.map)
On Thu, Sep 4, 2008 at 6:19 AM, Josip Gracin <josip....@gmail.com> wrote:
> Thanks, Mike! Works perfectly! (btw, only on Java 1.5 and not on 1.6.
> On 1.6 there's a problem with arguments to RT.map)
Care to share? I've been using Clojure on OpenJDK 1.6.0 for some time
without trouble. This includes calls to RT.map().
/mike.
In Maven compile plugin, when I set source and target (which
correspond to -source and -target options in javac) to either 1.5 or
1.6, everything works normally. But if I leave it undefined, compiler
reports the following failure.
/home/gracin/src/workspaces/main/maven-cljexec-plugin/src/main/java/com/ingemark/cljexec/CljExecMojo.java:[63,14]
map(java.lang.Object...) in clojure.lang.RT cannot be applied to
(clojure.lang.Var,java.lang.Object,clojure.lang.Var,java.lang.Object)
I don't have time (will, actually) to investigate further.