Hi,
2010/8/12 Matthew <[email protected]>
> Hello all,
>
> I've been looking at the new protocol (defprotocol, deftype,
> defrecord, etc) feature in 1.2 and, while I love the core concepts,
> it's been bothering me that there's no apparent way to provide
> *automatic* default implementations for methods on a protocol.
>
> I know from reading Rich Hickey's discussions on the design rationale
> [1] and other threads on providing Scala Trait-like behaviour [2] that
> you can choose to mix in a set of defaults when you implement the
> protocol, but it seems important to me that a protocol author be able
> to provide default implementations to enable protocols to evolve.
> Allowing a function body in the defprotocol clause would seem to be
> the obvious way, something like:
>
> (defprotocol P
> (foo [x] (default-foo x))
> (bar-me [x] (bar-me [1 x])
> [x y])) ; no default implementation
>
> As I'm sure most of you know, a key problem with "pure" interface
> features in environments like CORBA, COM, Java, etc has been that you
> can't add new methods to published interfaces: you'd break all
> existing implementations. Hence you see a history of evolving
> interfaces indicated by names like IFoo, IFoo2, IFooEx, etc. In
> contrast, a Scala-like trait system allows you to add a new method
> *and* a default implementation (supposing that makes sense), so old
> clients still work fine.
>
> The problem, as I see it, with Clojure protocols is that you would
> have to rely on clients mixing in a set of defaults in order to
> happily extend a "public" protocol.
>
> Am I missing something key here? I realise there are some very
> experienced people contributing to Clojure, so am fully expecting to
> be told I've missed something obvious ;)
>
Maybe have the library writer do this ? :
(defprotocol P
(foo [x] (default-foo x))
(bar-me [x] (bar-me [1 x])
[x y])) ; no default implementation
(def *P-defaults*
{:foo default-foo
:bar-me #(bar-me 1 %) })
and let the user pick the whole *P-defaults* for its mixins, or just parts
of it ? (does this make sense ?)
>
> Cheers,
>
> Matthew.
>
> [1] http://groups.google.com/group/clojure/msg/330c230e8dc857a9
> [2] http://groups.google.com/group/clojure/msg/53228e04db4799a5
>
> --
> 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]<clojure%[email protected]>
> 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 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