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.