Kevin and Phil nice work.

Now if only object returned by fn had implemented Serializable and
custom serialization functions which were doing:

  private void writeObject(ObjectOutputStream out) throws IOException
{
        (with-out-str
                (print (pr-str this)))
  }

private void readObject(ObjectInputStream in)
          throws IOException, ClassNotFoundException {
        (eval (read-string in))
 }

some simple expressions could be already transmited.

Also fn could be named somehow more declarative like sfn to highlight
this overhead.

Almost there!!!

On 11 Maj, 20:12, Phil Hagelberg <p...@hagelb.org> wrote:
> On Tue, May 11, 2010 at 6:18 AM, Konrad Hinsen
>
> <konrad.hin...@fastmail.net> wrote:
> >> Right now I can imagine that implementation would look like this. Each
> >> function has it own raw input form (string which is parsed by clj
> >> reader). On serialization, that raw form would be serialized and
> >> received on the other unit. With first call, such deserialized
> >> function would check if it is compiled, if not then it compiles its
> >> raw form then executes it.
>
> > That's not sufficient because you have to serialize closures, not plain 
> > functions. You need more than just the source code.
>
> Actually in Clojure 1.2 the closure's lexical environment is exposed
> to macros, so this is doable. The serializable-fn tool that Kevin
> linked to demonstraes a primitive form of this, though I haven't tried
> closing over too many different types yet.
>
> (defn- save-env [env form]
>   (if env
>     `(let ~(vec (apply concat (for [[name local] env]
>                                 [name (.eval (.init local))])))
>        (~...@form))
>     form))
>
> (defmacro fn [& sigs]
>   `(with-meta (clojure.core/fn ~...@sigs)
>      {:type ::serializable-fn
>       ::source (quote ~(save-env &env &form))}))
>
> The problem is that the .eval method isn't supported on all expression
> types; it needs a more generalized way of getting the value of any
> compiler expression. I haven't had a chance to really dig into the
> compiler to see if there's a single way to do that, but I wouldn't be
> surprised if there were a simpler solution.
>
> -Phil
>
> --
> 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 
> athttp://groups.google.com/group/clojure?hl=en

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