> The problem is you aren't quoting the forms fed to eval.
That was intentional. Imagine a broader example, where I want to read
in a form, examine/print/etc. parts of it, then evaluate it.
Printing a struct-map produces map syntax.
Reading the output produces a literal map with unevaluated contents.
E.g.,
user=> (read-string "{:foo (fn [x] (+ 1 x)) :bar 2}")
{:foo (fn [x] (+ 1 x)), :bar 2}
;; Now I can examine the syntactic form of the function, but fetch it
with (:foo x).
;; I can eval this to get a final object.
user=> (eval *1)
{:foo #<user$eval__7$fn__9 user$eval__7$fn...@230c34a9>, :bar 2}
Evaluating the read forms produces a literal map with evaluated
contents. Modulo unreadable things like functions, the original struct-
map and the read+eval'ed struct map are identical, but have different
types.
> This:
> (eval (struct foo 1 2))
> mean this:
> (eval {:bar 1 :baz 2})
>
> And small literal maps are eval'd as a PersistentArrayMap
I know. The reason this is a gotcha is that -- just like sorted maps
and sets -- these data structures are not quite homoiconic. That is,
reading the printed representation of a data structure returns a
structure with similar but different properties.
If I wasn't using accessors, it would never have occurred to me that
my in-memory struct maps would come back as plain ol' maps. It doesn't
confound me, I just didn't think of it in advance.
> Now if instead you do:
> (eval '(struct foo 1 2))
> then eval is eval'ing the form (struct foo 1 2), thus the return from
> eval is as you would expect:
>
> user=> (foo-bar (eval '(struct foo 1 2)))
Indeed. That is all basic stuff that a novice Lisper would know.
The scenario here, though, is different: given an *existing* struct-
map (which prints as {:foo 1 :bar 2} -- not a form), one cannot print
it in such a way that the struct-map-ness is preserved when it is re-
read. You can discover that it's a struct-map (type =>
PersistentStructMap), but not what kind of struct-map it is.
The same is true of sorted maps and sets, and assorted other data
structures. Clojure's situation is much better than that of Common
Lisp, and (as I said) I don't regard it as a bug that not all
attributes of a structure are preserved through printing and re-
reading, but I thought others might benefit from my experience…
particularly because accessors would seem to offer additional speed
for free.
-R
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---