so clients don't directly call the protocol functions they call
print-ast which then checks to see if PrettyPrintable has been
extended to the object and falls back to the default if it hasn't

On Thu, Aug 12, 2010 at 6:16 PM, Matthew Phillips <mattp...@gmail.com> wrote:
> On Aug 13, 3:38 am, Stuart Halloway <stuart.hallo...@gmail.com> wrote:
>> > Stu, (or anybody) I'd like to ask about a variation on this
>> > point. How do you handle the case where you have a general
>> > function that works for every type you'd like to implement a
>> > protocol for (thus not technically needing to be in a protocol),
>> > but maybe 1 or 2 of the many types have more efficient
>> > implementations possible? Do you just suck it up and copy and
>> > paste the general function around? Or is there a better way? Maybe
>> > the new case function?
>>
>> This might be a job for a more granular protocol. Take a look at how
>> granular Clojure's implementation abstractions are (even prior to
>> the introduction of protocols). The Java interfaces often have 0, 1,
>> or 2 methods.
>
> The scenario I'm thinking of is when you've already published a
> protocol, and now want to extend it. Instead, you could just create a
> new (granular) protocol, but that does seem to lead inexorably to the
> IFoo, IFoo2, IFoo3, situation.
>
> A more concrete example: say I've defined a protocol for AST nodes in
> 1.0 of a library, and later when developing 2.0 I discover it would
> have been a good idea to have a "pretty-print" method on nodes to show
> human-readable output. If the protocol had Trait-like characteristics
> I could add pretty-print to the protocol, with a default
> implementation that just prints the fields of the node, but override
> that with a better implementation for some of the new record types I'm
> including in 2.0.
>
> But I can't do that because, unless I've had the foresight to make
> sure clients always mix in a base set of (partial) defaults that I
> provide (which may be initially empty), then things break down. Sean
> Devlin's ideas (referenced earlier on the thread) on making it easy to
> mix in defaults would be great for this, but they don't really address
> the issue I'm looking at here.
>
> Following Stuart's suggestion, I *could* just add a protocol called
> "PrettyPrintable" with one method and implement it on some of the new
> node types, but now I can't just call "pretty-print" on any node: I
> need to write another function that checks if it's a PrettyPrintable
> first and calls something default if not.
>
> I've had to do this sort of thing many, many times in Java: one of the
> reasons I got excited about multimethods in Clojure is that they allow
> me to transparently extend the system after the fact with no such
> ugliness.
>
> Thanks to the superpower that is macro, I'm sure I could make a
> defprotocol+ and a extend+ that do this, just wanted to check that
> there's really no better way.
>
> Cheers,
>
> Matthew.
>
> --
> 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



-- 
And what is good, Phaedrus,
And what is not good—
Need we ask anyone to tell us these things?

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