You are right, it's beacsue of print-dup. Hence it works only on functions which aren't closures:
=> (let [a nil x (fn [] a)] (eval [x])) IllegalArgumentException No matching ctor found for class user$eval3989$x__3990 Why is emitValue used? Regular code forms (as returned by the reader) don't usually contain functions. When the compiler doesn't know how to evaluate some value it treats it as a constant. Constants are serialized in the class and read back/instanciated when the class is loaded. On Thu, Aug 8, 2013 at 6:30 PM, Jamie Brandon <ja...@scattered-thoughts.net>wrote: > The Fn case works because print-dup is defined on fns: > > user=> (binding [*print-dup* true] (println (fn [] nil))) > #=(user$eval2502$fn__2503. ) > nil > user=> (read-string "#=(user$eval2502$fn__2503. )") > #<user$eval2502$fn__2503 user$eval2502$fn__2503@19037d90> > > I still can't figure out why Compiler.emitValue is used though. Am I > right in thinking that clojure.core/eval is not calling the function > that the compiler uses, but instead serializing everything and pushing > it through the same pathway as compiling text files? > > On 8 August 2013 16:43, Christophe Grand <christo...@cgrand.net> wrote: > > Right now I ca't figure why the fn case is working but the anonyous Var > is > > failing because the vars are specially handled: > > > > else if(value instanceof Var) > > { > > Var var = (Var) value; > > gen.push(var.ns.name.toString()); > > gen.push(var.sym.toString()); > > gen.invokeStatic(RT_TYPE, Method.getMethod("clojure.lang.Var > > var(String,String)")); > > } > > > > Christophe > > > > > > > > On Thu, Aug 8, 2013 at 4:44 PM, Jamie Brandon < > ja...@scattered-thoughts.net> > > wrote: > >> > >> What if it isn't inside a constant? > >> > >> user=> (eval `(fn [] ~#'x)) > >> #<user$eval1366$fn__1367 user$eval1366$fn__1367@15dbb76> > >> > >> user=> (with-local-vars [x nil] (eval `(fn [] ~x))) > >> CompilerException java.lang.NullPointerException, > >> compiling:(NO_SOURCE_PATH:1:1) > >> > >> How about functions? These are unreadable but they still eval > >> correctly inside constants. > >> > >> user=> (letfn [(x [] nil)] (eval x)) > >> #<user$eval1377$x__1378 user$eval1377$x__1378@5fea6729> > >> > >> user=> (letfn [(x [] nil)] (eval [x])) > >> [#<user$eval1381$x__1382 user$eval1381$x__1382@e3b7c27>] > >> > >> user=> (read-string "#<user$x user$x@1981e4d>") > >> RuntimeException Unreadable form clojure.lang.Util.runtimeException > >> (Util.java:219) > >> > >> user=> (defn x [] nil) > >> #'user/x > >> > >> user=> (eval x) > >> #<user$x user$x@14ff1714> > >> > >> user=> (eval [x]) > >> [#<user$x user$x@5892d4a8>] > >> > >> user=> (read-string "#<user$eval1381$x__1382 > >> user$eval1381$x__1382@e3b7c27>") > >> RuntimeException Unreadable form clojure.lang.Util.runtimeException > >> (Util.java:219) > >> > >> On 8 August 2013 14:58, Christophe Grand <christo...@cgrand.net> wrote: > >> > The error is caused by the fact that eval sees the var as a constant > (or > >> > part of) and tries to serialize the constant. > >> > #<Var: --unnamed--> is unreadable while #'user/x is that explains teh > >> > difference in behaviour. > >> > > >> > > >> > On Thu, Aug 8, 2013 at 3:40 PM, Jamie Brandon > >> > <ja...@scattered-thoughts.net> > >> > wrote: > >> >> > >> >> This has me stumped: > >> >> > >> >> user=> (with-local-vars [x nil] (eval x)) > >> >> #<Var: --unnamed--> > >> >> user=> (with-local-vars [x nil] (eval [x])) > >> >> CompilerException java.lang.NullPointerException, > >> >> compiling:(NO_SOURCE_PATH:1:1) > >> >> > >> >> By comparison: > >> >> > >> >> user=> (def x nil) > >> >> #'user/x > >> >> user=> (eval #'x) > >> >> #'user/x > >> >> user=> (eval [#'x]) > >> >> [#'user/x] > >> >> > >> >> -- > >> >> -- > >> >> 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/groups/opt_out. > >> >> > >> >> > >> > > >> > > >> > > >> > -- > >> > On Clojure http://clj-me.cgrand.net/ > >> > Clojure Programming http://clojurebook.com > >> > Training, Consulting & Contracting http://lambdanext.eu/ > >> > > >> > -- > >> > -- > >> > 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/groups/opt_out. > >> > >> -- > >> -- > >> 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/groups/opt_out. > > > > > > > > > > -- > > On Clojure http://clj-me.cgrand.net/ > > Clojure Programming http://clojurebook.com > > Training, Consulting & Contracting http://lambdanext.eu/ > > > > -- > > -- > > 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/groups/opt_out. > > -- > -- > 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/groups/opt_out. > -- On Clojure http://clj-me.cgrand.net/ Clojure Programming http://clojurebook.com Training, Consulting & Contracting http://lambdanext.eu/ -- -- 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/groups/opt_out.