Chouser <chou...@gmail.com> writes:

> I haven't tried all the above, but I had a couple thoughts that might help:
>
> First, inside #=(), arguments aren't evaluated.  They act as if quoted:
>
>     #=(+ 1 (+ 2 4))
>     ; ClassCastException clojure.lang.PersistentList cannot be cast to
> java.lang.Number clojure.lang.Numbers.add (Numbers.java:126)
>
> The list (+ 2 4) is passed as a list to the outer +, which fails
> because it's expecting a number not a list.  So one alternative would
> be:
>
>     #=(+ 1 #=(+ 2 4))
>     ;=> 7

I'm unable to programmatically generate nested #=() forms. :-(

  user> (str "#=" `(1 "#=" (+ 2 3)))
  "#=(1 \"#=\" (clojure.core/+ 2 3))"

How would I do so?

> But please consider another alternative:
>
>     (+ 1 (+ 2 4))
>     ;=> 7
>
> That is, if you're going to be evaluating a large amount of code while
> reading your data back into memory, why not just go ahead and eval it
> instead of just reading it?
>
>     (read-string "#=(+ 1 #=(+ 2 4))")
> vs.
>     (eval (read-string "(+ 1 (+ 2 4))"))

I've tried spitting out forms without the #=, and that basically does
the trick for my objects.

  "(de.uni-koblenz.funtg.core/vertex
    (de.uni-koblenz.funtg.core/*serialization-bindings*
     \"c06de1c7-f4ec0906-21cfbc86-28c31aa1\")
    1)"

That can be loaded back with `load-string' or (eval (read-string ...))
[if the right graph is bound by *serialization-bindings*, of course].

However, my intent is to be able so seamlessly load and store any data
structure build upon clojure data structures mixed with vertices and
edges.  The approach fails if I try to write/read something like that

  #{1 2 (take 3 (vseq (rg)))}

where vseq is the lazy seq of a graph's vertices.  Writing that results
in a string like

  "#{1 2 ((vertex (*serialization-bindings* ...) 1)
          (vertex (*serialization-bindings* ...) 2)
          (vertex (*serialization-bindings* ...) 3))}"

and clearly when evaling, the result of the first vertex call [a vertex]
will be treated as a function, which it is not.

Reading a form with nested #= works just fine (namespace stripped for
brevity):

  "#{1 2 (#=(vertex #=(*serialization-bindings* 
\"c06de1c7-f4ec0906-21cfbc86-28c31aa1\") 1)
          #=(vertex #=(*serialization-bindings* 
\"c06de1c7-f4ec0906-21cfbc86-28c31aa1\") 2)
          #=(vertex #=(*serialization-bindings* 
\"c06de1c7-f4ec0906-21cfbc86-28c31aa1\") 3))}

So currently it seems to me that writing those nested #=() forms is the
most practical way.  But I'm open for other suggestions as well.

Bye,
Tassilo

-- 
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

Reply via email to