Have thoughts about this, will have to collect them, will reply soon.

On Thu, Feb 5, 2009 at 9:06 PM, mikel <mev...@mac.com> wrote:

>
>
>
> On Feb 5, 7:12 pm, David Nolen <dnolen.li...@gmail.com> wrote:
> > > I'm not looking for a way to statically define protocols in which
> > > classes participate. Consider an example similar to the one I gave in
> > > my reply to Laurent:
> >
> > Static defining of anything is just a matter of chose, especially in
> > Clojure.  For example in Spinoza you have pose-as which changes the class
> of
> > an object. The primary purpose of Spinoza is structural inheritance and
> > basic dispatch on type, but I've been thinking about runtime modification
> > and your post gives me a lot of ideas.
> >
> > > (make-thing {:models [::vehicle ::airborne]
> > >                    :protocols [::thing ::idea]
> > >                   :inits {:name "test-thing1" :number 1}})
> >
> > Something like this would be quite simple to build on top of Spinoza.
>  Also
> > allowing protocols to be defined at class definition time and runtime
> would
> > work the same way that pose-as works
> >
> > (adopt-protocol obj ::some-protocol ::another-protocol)
> >
> > > Note that no classes are involved. The thing in question is not an
> > > instance of any class (except incidentallly, by virtue of the fact
> > > that Clojure's runtime is built on the JVM). I never defined any
> > > classes, nor did I wish to. A class definition would have been just an
> > > obstacle, not directly relevant to my goal, which was to instantiate
> > > an object that reflects these models and participates in these
> > > protocols.
> >
> > As I'm alluding above, this direction seems prototypal, and I've been
> > thinking about allowing for these kind of behaviors in Spinoza.
> >
> > Of course no collaboration beyond healthy discussion is expected.  Thanks
> > for bringing the topic up again :)
>
> It's not quite the same as the usual prototype-based systems either.
> Generally, in a protoype-based system you have one of two inheritance
> schemes:
>
>  1. structure and behavior are copied (inherited) from one or more
> prototypes (or "parents"), as in Javascript
>
> or
>
>  2. structure is copied from one prototype (the "data parent");
> behavior is copied from another (the "behavior parent") as in Self
>
> The model/protocol/thing stuff does not use parent objects at all. It
> collects field specifications from model objects, but no inheritance
> relationship is established. It uses the protocols to establish
> multimethod dispatch in the manner of derive, but no delegate object
> is used.
>
> Ruben Kleiman's SK8 system had a prototype-based object model that
> would have made it easy to implement all the features of the model/
> protocol/thing subsystem, but his object system was not typical. It
> had more in common with frame systems like KEE than with typical
> class- or prototype-based object models. His object model included per-
> object configurable inheritance (and per-slot configurable accessors--
> in fact, each slot of an object--slot, not value--could itself be an
> arbitrary object with arbitrary model and protocol). I'm not entirely
> sure I want to recapitulate the entire SK8 object model for this
> project, though. :-)
>
> There are a few more things I want to get working:
>
> 1. you should be able to pass a set of map literals as the models
>
> 2. you should be able to pass a set of dynamically computed protocol
> objects (whatever those turn out to be) as the protocols
>
> 3. Given a thing, you should be able to ask it what models it
> represents and what protocols it implements
>
> 4. Given a model and a thing, you should be able to ask whether the
> thing represents the model
>
> 5. Given a protocol and a thing, you should be able to ask whether the
> thing implements the protocol
>
> 6. It should be easy and natural to create models, protocols, and
> things dynamically and without any static declarations being required.
> Classes, if they exist at all, should be optional. It should be
> possible to dynamically create a thing from arbitrary sets of models,
> protocols, and initial map entries (subject to consistency checks).
>
> 7. It should be straightforward to serialize models, protocols, and
> things (this subsystem is not an end in itself, but a component of a
> larger project in which it's important that the data objects be
> amenable to serialization and deserialization, both for storage in
> nonvolatile repositories and for transmission over communication
> channels; getting deserialization right for 3,4, and 5 is a problem
> when 6 is supported)
>
> 8. mutually contradictory models or protocols should be detected when
> used
>
> 9. It should be possible to resolve ambiguous dispatch conditions per
> instance rather than globally (Clojure's derive and prefer-method do
> not support this, but predicate dispatch would make it easy to do)
>
> 10. It should be possible to specialize a multifunction per instance
> (the CLOS feature is called "eql specializers")
>
> Naturally, all these features should come at reasonable cost in terms
> of performance, complexity, and clarity.
>
> It's not clear to me at the moment that Spinoza would make the
> numbered items easier to do, but it it would, then I should be using
> it.
>
>
>
> >
>

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