Actually, scratch some of what I said (it's late). It's not that the value 
gets compiled into the class - the -main function will actually look up the 
value of *ns*. The difference is only in the ordering of what happens in 
the two scenarios.

If you do "lein run", that will invoke clojure.main with a main class. 
Going through clojure.main will set the *ns* to `user`.

If you do "java -jar target/whatever-standalone.jar", then you will just 
load and invoke the main class set in the manifest (dda.main). Loading that 
class will (as a side effect) load RT where *ns* is set to clojure.core, 
but will not run through the code in clojure.main.


On Tuesday, June 20, 2017 at 11:03:35 PM UTC-5, Alex Miller wrote:
>
>
>
> On Tuesday, June 20, 2017 at 7:43:53 PM UTC-5, Didier wrote:
>>
>> *ns* is a dynamic var, so it points to the current namespace when your 
>>> function is running. Most code doesn't switch into a target ns in order to 
>>> execute functions from it.
>>>
>>
>> I understand that, and I understand most code does not switch into the 
>> target ns. But this is not most code, this is the code generated by the 
>> gen-class directive to bootstrap your -main method from java. Both lein and 
>> clojure.main bootstrap your main method from inside "user", but gen-class 
>> does so from inside "clojure.core".
>>
>> So I want to know:
>>
>> 1) Why does the generated java class from gen-class has "clojure.core" as 
>> its current namespace?
>>
>
> gen-class causes a namespace to be AOT compiled to a class. Leiningen runs 
> the AOT compilation by invoking the compiler. The initial value of *ns* is 
> clojure.core (see RT.java 
> <https://github.com/clojure/clojure/blob/d7e92e5d71ca2cf4503165e551859207ba709ddf/src/jvm/clojure/lang/RT.java#L221-L222>).
>  
>
>
 

> During compilation, nothing ever changes this, so that's what gets 
> compiled into the Java class on disk. When you invoke it, this value has 
> been compiled into the class already.
>
^^ wrong
 

>
> When you invoke -main directly, you are running in the repl. The repl sets 
> the value 
> <https://github.com/clojure/clojure/blob/d7e92e5d71ca2cf4503165e551859207ba709ddf/src/clj/clojure/main.clj#L307>
>  
> of *ns* to "user" when it starts, so that's what you see.
>  
>
>> 2) Why doesn't the (ns) function inside my namespace change the current 
>> namespace?
>>
>
> It does, but only when you run it. The AOT compiled class also creates an 
> init class that will cause the same effects as loading a non-compiled clj 
> file. That file has already expanded `ns` but it will include a call to 
> `in-ns` that will change the current namespace. 
>

 

> However, the compiled class for the -main function already has the value 
> at the time of compilation, so that doesn't matter.
>
^^ wrong
 

>  
>

-- 
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