On Wed, Jun 5, 2019 at 6:08 PM Yanghao Hua <yanghao...@gmail.com> wrote: > > On Wed, Jun 5, 2019 at 12:52 AM Greg Ewing <greg.ew...@canterbury.ac.nz> > wrote: > > > > Yanghao Hua wrote: > > > Did Guido say "user defined syntax" or "user defined operator"? > > > ... for me defining new operator is different > > > > To my mind it's not that much different. A reader encountering an > > unfamiliar operator is pretty much faced with a new piece of > > syntax to learn. Its spelling gives little to no clue as to its > > meaning, it precedence in relation to other operators is not > > obvious, etc. > > > > > The way scala allows user to define new operator is > > > really elegant, > > > > There are some differences between Python and Scala that present > > practical difficulties here. Some kind of declaration would be > > needed to define its arity, precedence and corresponding dunder > > method. This is no problem in Scala because it analyses imported > > code at compile time. But the Python compiler only sees the module > > being compiled, so it has no ability to import these kinds of > > declarations from another module. > > My understood how scala achieves this is, whenenver it sees "taken1 > token2 token3" kind of expression, it does token1.token2(token3). So > it was assumed token2 is a method of token1 and it always takes one > argument. > > With my very limited understanding of cpython internals (at least when > I implement <==) it seems cpython is searching for an operator and > then translates it into a method call on the objects, so what if > instead of telling e.g. python to search __add__ method call, it > should search int.+ (the "+" method call) instead? Not sure if this > helps at all I believe there are tons of other problems too. This is > definitely NOT an easy thing to add post-fact if not thought through > from the very beginning.
Part of the reason you can't just treat the + operator as a method call is that there are reflected methods. Consider: class Int(int): def __radd__(self, other): print("You're adding %s to me!" % other) return 1234 x = Int(7) print(x + 1) print(1 + x) If these were implemented as x.__add__(1) and (1).__add__(x), the second one would use the default implementation of addition. The left operand would be the only one able to decide how something should be implemented. ChrisA _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org %(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s Code of Conduct: http://python.org/psf/codeofconduct/