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
<[email protected]>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 <[email protected]> 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 <
> [email protected]>
> > 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 <[email protected]> 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
> >> > <[email protected]>
> >> > 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 [email protected]
> >> >> Note that posts from new members are moderated - please be patient
> with
> >> >> your first post.
> >> >> To unsubscribe from this group, send email to
> >> >> [email protected]
> >> >> 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 [email protected].
> >> >> 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 [email protected]
> >> > Note that posts from new members are moderated - please be patient
> with
> >> > your
> >> > first post.
> >> > To unsubscribe from this group, send email to
> >> > [email protected]
> >> > 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 [email protected].
> >> > 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 [email protected]
> >> Note that posts from new members are moderated - please be patient with
> >> your first post.
> >> To unsubscribe from this group, send email to
> >> [email protected]
> >> 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 [email protected].
> >> 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 [email protected]
> > Note that posts from new members are moderated - please be patient with
> your
> > first post.
> > To unsubscribe from this group, send email to
> > [email protected]
> > 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 [email protected].
> > 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 [email protected]
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected].
> 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 [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to