On Fri, Mar 14, 2014 at 11:41 PM, Nathaniel Smith <njs@pobox.com> wrote:

Here's the main blocker for adding a matrix multiply operator '@' to Python: we need to decide what we think its precedence and associativity should be.

I am not ready to form my own opinion, but I hope the following will help shaping the discussion.

Currently, [1], Python operator precedence is

+, - |
Addition and subtraction |

*, /, //, % |
Multiplication, division, remainder [5] |

+x, -x, ~x |
Positive, negative, bitwise NOT |

** |
Exponentiation [6] |

x[index], x[index:index], x(arguments...), x.attribute |
Subscription, slicing, call, attribute reference |

We need to decide whether @ belongs to one of the existing row or deserves one of its own.

The associativity debate is one of those debates [2] where there is no right answer. Guido has very wisely left it for the numeric community to decide. I would start with surveying the prior art of using right associativity and the reasons it was chosen and see if those reasons apply. (An example of a choice made for wrong reasons is our decimal system. We write our numbers backwards - from high to low place value - only because we took them from people who write text from right to left. As a result, computer parsers have to skip to the last or count the number of digits before they can start evaluating the number.)

Here is the start:

1. APL uses right to left associativity for all operators and all operators have the same precedence.

2. Exponentiation operator is right associative in most languages with MATLAB being a notable exception.