I only noticed it because I was trying to write a macro which expands to multiple def calls. This requires the def's to be inside a do block, which made me question a whole lot about how the AOT compiler works.
On Tue, Apr 15, 2014 at 11:05 PM, Phillip Lord <phillip.l...@newcastle.ac.uk > wrote: > > You need to distinguish between "compiled" and "aot compiled to byte > code". > > As far as I know, all forms are compiled before they are executed. So, > if you type: > > (+ 1 1) > > it is first compiled to bytecode, and then run. It's not executed at > compile time at all; rather when it is evaluated, it is compiled and > then run. If you aot compile, then you are do the same thing, but dump > the bytecode to file. So, you still evaluate the entire top level. > > So, when you say compile, I presume you you mean aot compiled. Macros > have to be run, so the question is should they be expanded but not > evaluated? And what about macros with side-effects? > > And if top level forms are NOT evaluated when loaded what would this do: > > (ns user) > (def x 1) > > (load "user_y") > > === in user_y.clj > (def y 1) > > > Now the AOT would only load the first file in the namespace because > (load "user_y") would not be evaluated. > > Why are you worried about this? Most of the time compilation in Clojure > is an implementation detail, as it is in python. It just happens when it > needs to, and away you go. > > Phil > > > > Andrew Chambers <andrewchambe...@gmail.com> writes: > > Why are the toplevel forms which arent macros executed at compile time? > For > > example Lua can be compiled to bytecode without executing > > its top level calls. > > > > > > On Tue, Apr 15, 2014 at 9:04 PM, Softaddicts < > lprefonta...@softaddicts.ca>wrote: > > > >> Ahem :) > >> > >> a) The fn x does not exist in the universe until you call foo, hence you > >> cannot > >> expect the compiler to known anything about it if it's not called > >> before > >> making any reference to x. > >> > >> b) If you refer to x at the top level (the "universe" above :) before > >> defining > >> it, obviously it does not exist. You might use (declare x) before > >> referring to it. This allows you to define it later at your > >> convenience. > >> > >> c) In general, you should avoid using def/defn within a function. > >> Macros may do that but this is a different story. > >> > >> d) Yes code at the top level is executed, how can you expect > >> the REPL to work interactively if forms are not evaluated first ? > >> A defn expands to a function call, a special form in fact but it > still > >> behaves > >> like a function. Any function call at top level will get executed > >> after being > >> compiled to byte code. > >> > >> Now about the "compilation" step... > >> > >> Traditionally, most Lisps allow you to refer to stuff in interpreted > mode > >> not defined yet hoping that it will get defined by the time you run the > >> code > >> that refers to these undefined things. It can even be something > transient > >> on > >> the stack... oups... > >> > >> You can still compile in other Lisps but this is a special case where > you > >> have to > >> make sure that stuff is defined in some way. You need to add directives > to > >> tell the compiler that this stuff will exist later and that it can > safely > >> refer to it. > >> > >> On the JVM, some underlying byte code has to be generated for any forms > >> typed in the REPL at the top level any reference has to be defined > before > >> hand. > >> > >> There's no other way to generate byte code... there cannot be black > holes > >> waiting to get filled later. > >> > >> Hence the "compilation" phase and the restriction > >> that stuff you refer to are to be defined either directly or using > declare. > >> > >> Hope it explains the compromise. > >> > >> Luc P. > >> > >> > >> > Is there an explanation of how clojure deals with scoping and its > static > >> > checking. It seems to be a hybrid of a static language and a dynamic > >> > language when it comes to compilation. I'll elaborate. > >> > > >> > The following code wont compile: > >> > (defn x [] nil) > >> > (defn y[]) ((x)) > >> > > >> > however this code will compile: > >> > > >> > (defn foo[] (defn x[] nil)) > >> > (defn y[]) ((x)) > >> > > >> > but calling y before foo fails with a runtime exception. > >> > > >> > Also, the following code: > >> > > >> > (println "hello") > >> > (defn -main [args] > >> > (println "world")) > >> > > >> > prints "hello" at compile time > >> > and also > >> > "hello > >> > world" at runtime. > >> > > >> > My conclusions from this is that the static symbol checker is actually > >> > fairly stupid and is just there to provide some simple sanity, and > that > >> all > >> > toplevel code in a namespace > >> > is executed at compile time AND at runtime. Is this correct? > >> > > >> > -- > >> > 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. > >> > > >> -- > >> Softaddicts<lprefonta...@softaddicts.ca> sent by ibisMail from my ipad! > >> > >> -- > >> 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 a topic in the > >> Google Groups "Clojure" group. > >> To unsubscribe from this topic, visit > >> https://groups.google.com/d/topic/clojure/VUWTAwOEHS0/unsubscribe. > >> To unsubscribe from this group and all its topics, send an email to > >> clojure+unsubscr...@googlegroups.com. > >> For more options, visit https://groups.google.com/d/optout. > >> > > -- > Phillip Lord, Phone: +44 (0) 191 222 7827 > Lecturer in Bioinformatics, Email: > phillip.l...@newcastle.ac.uk > School of Computing Science, > http://homepages.cs.ncl.ac.uk/phillip.lord > Room 914 Claremont Tower, skype: russet_apples > Newcastle University, twitter: phillord > NE1 7RU > > -- > 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 a topic in the > Google Groups "Clojure" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/clojure/VUWTAwOEHS0/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- 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.