Thanks for taking an interest, Brent.

Interesting that you're using atoms rather than vars - it means that method
registration is no longer thread-local. I wonder if there could be a
scenario where method registration was actually used to coordinate between
threads? :-)

That could actually be useful if you were using plural dispatch as an event
dispatching system, though whether it would be wise is another question...

Cheers,

Chris

On 6 September 2012 20:27, Brent Millare <brent.mill...@gmail.com> wrote:

> I've made my own take of your plural dispatch system.
>
> https://gist.github.com/3659663
>
> I switched from using vars and a map for determining which pluralfn to
> use, to atoms and metadata tied to the pluralfn. My method reduces the
> amount of indirection and invocations. I originally tried to make a deftype
> version to store the data, but then I'd have to reimplement all of the
> microsyntax of of clojure.core/fn and expand out the args to all the
> arities, not fun.
>
> Also I created defplural-body which doesn't specify the argument arity
> which you can use to avoid sequencing/unsequencing arguments for
> performance. I defined defplural in terms of defplural-body, which
> maintains compatibility with your examples.
>
> My code has the advantage over some implementation details in multimethods
> in that redefining the pluralfn does not cause you to forget all the
> implementations since defplural-body checks for existing implementations.
> This, however, will require the user to run clear-implementations! if one
> does want to forget all the implementations.
>
>
> On Wednesday, September 5, 2012 6:48:36 AM UTC-4, Chris Ford wrote:
>>
>> I was watching David Nolan's talk about predicate 
>> dispatch<http://blip.tv/clojure/david-nolen-predicate-dispatch-5953889>,
>> and he articulated something that I've found frustrating about multimethods
>> - the set of implementations is open, but the dispatch function is closed.
>> That means that if your dispatch value can't be computed in the same way
>> for all your data, you can't use multimethods.
>>
>> Predicate dispatch allows implementations to be registered with a test
>> that decides whether or not they are applicable, so it can do things that
>> multimethods cannot. For example, predicate dispatch would allow you to
>> write an open function that categorises integers as "prime", "perfect" or
>> some other category without baking them all into the dispatch function.
>>
>> In his talk, David speaks about the problem of overlap. 2 is both "prime"
>> and "even", for example. That got me thinking whether overlap is a bug or a
>> feature.
>>
>> I've hacked together a simple plural dispatch 
>> system<https://gist.github.com/3634871>,
>> which allows the specification of a custom resolution function that can
>> decide whether to use one or all of the registered implementations. You can
>> use this system to implement both multimethods and predicate dispatch.
>>
>> What practical reason would you have for doing this? Random dispatch!
>> Can't decide which implementation to use? Now you don't have to!
>>
>> (defplural random (fn [implementations args] (-> implementations rand-nth
>> (apply args))))
>> (defimplementation random #(+ % 100))
>> (defimplementation random #(- % 100))
>> (random 1)
>>
>> It could also be useful for gathering a set of all possible results,
>> quasi-AOP extension points, broadcasting events etc.
>>
>> Cheers,
>>
>> Chris
>>
>  --
> 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

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