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.