This actually seems to work for deftypes too:

user=> (deftype Foo [])
user.Foo
user=> (eval (Foo.))
#<Foo user.Foo@4450c45f>
user=> (eval [(Foo.)])
[#<Foo user.Foo@71c76cf5>]

But not for arbitrary objects:

user=> (eval (java.io.StringReader. "foo"))
#<StringReader java.io.StringReader@7e5ef8e8>

user=> (eval [(java.io.StringReader. "foo")])
CompilerException java.lang.RuntimeException: Can't embed object in
code, maybe print-dup not defined: java.io.StringReader@7504a5ce,
compiling:(NO_SOURCE_PATH:1:1)


So I guess Fn and Var have print-dup methods defined. I still don't
understand why print-dup is used at all though.

On 8 August 2013 15:44, 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.

Reply via email to