On Jul 17, 2014 11:56 PM, "Nils Bruin" <nbr...@sfu.ca> wrote:
>
> On Thursday, July 17, 2014 10:35:32 PM UTC-7, Robert Bradshaw wrote:
>>
>> I'm not sure multimethods alone are enough to solve issues with Sage's
>> type system (e.g. coercion, where the result of a+b may happen in a
>> completely new domain) but they could certainly help.
>
>
> Indeed. If you want multiple dispatch in python you can have it:
>
>  class multi_dispatch(object):
>     def __init__(self):
>         self.dispatch = []
>     def register_function(self,signature,function):
>         self.dispatch.append( (signature,function) )
>     def register(self,*signature):
>         def register_decorator(function):
>             self.register_function(signature,function)
>             return function
>         return register_decorator
>     def __call__(self,*args):
>         for sig in self.dispatch:
>             if len(args) == len(sig) and all(isinstance(a,b) for a,b in
zip(args,sig[0])):
>                 return sig[1](*args)
>         raise TypeError("Signature not implemented")
>
>
> With this it is now quite straightforward to write multiple dispatch at
the cost of using a decorator:
> T = multi_dispatch()
>
> @T.register(int,int)
> def int_int(a,b):
>     return "called with integers (%d,%d)"%(a,b)
>
> @T.register(int,float)
> def int_float(a,b):
>     return "called with integer and float (%d,%f)"%(a,b)
>
> @T.register(float,float)
> def float_float(a,b):
>     return "called with floats (%f,%f)"%(a,b)
>
> You can then just call T:
>
> >>> T(1,2)
> 'called with integers (1,2)'
> >>> T(1,2.0)
> 'called with integer and float (1,2.000000)'
> >>> T(1.0,2.0)
> 'called with floats (1.000000,2.000000)'
> >>> T(1.0,2)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "dispatch.py", line 15, in __call__
>     raise TypeError("Signature not implemented")
> TypeError: Signature not implemented
>
> The key is in optimizing the signature lookup (and the kind of lookup can
definitely be refined a *lot* in the above implementation--linear search by
registration order is probably not optimal) and finding a useful way of
describing signatures and properly prioritizing which signature should get
precedence (if you think C3 is complicated for multiple inheritance, brace
yourself for multiple dispatch).
>
> In a dynamically typed language, multiple dispatch has a rather high
cost. LISP MOP implementations have a lot of experience. In the end it's
just a little helper tool, though. It doesn't really do things you can't
otherwise do.
>

Magma uses "multiple dispatch" extensively to deal with what our coercion
model code addresses, and it's definitely a step back in my experience.

> --
> You received this message because you are subscribed to the Google Groups
"sage-devel" group.
> To unsubscribe from this group and stop receiving emails from it, send an
email to sage-devel+unsubscr...@googlegroups.com.
> To post to this group, send email to sage-devel@googlegroups.com.
> Visit this group at http://groups.google.com/group/sage-devel.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to