TIP: 274 Title: Right-Associativity for the Exponentiation Operator Version: $Revision: 1.9 $ Author: Arjen Markus Author: David Smith Author: Richard Suchenwirth Author: Don Porter Author: Sérgio Loureiro State: Final Type: Project Vote: Done Created: 15-Sep-2006 Post-History: Keywords: Tcl,expr Tcl-Version: 8.5 ~ Abstract This TIP clarifies and corrects the associativity behaviour of the exponentation operator that was introduced in [123]. ~ Background The exponentiation operator found in various programming languages has a distinct right associativity. In this way it differs from the other arithmetic operators. Some languages do implement with left-associativity but this is felt to be awkward by many users. [123] introduced an exponentiation operator into Tcl 8.5 and was quite elaborate in defining its behaviour with respect to integer arguments, as there are quite a few corner cases to be examined. However, it was vague on the issue of associativity and in fact showed by one example that the operator as implemented then was left-associative. ~ Rationale A left-associative exponentiation operator is less useful than a right-associative operator, as pointed out in the Wikipedia article http://en.wikipedia.org/wiki/Associative . To illustrate, a left-associative exponentiation operator behaves like this: > ''x'' '''**''' ''y'' '''**''' ''z'' = (''x'' '''**''' ''y'') '''**''' ''z'' = ''x'' '''**''' (''y'' * ''z'') Whereas a right-associative exponentiation operator behaves like this: > ''x'' '''**''' ''y'' '''**''' ''z'' = ''x'' '''**''' (''y'' '''**''' ''z'') Thus, if the operator is left-associative, then the above expression can be rewritten using a single exponentiation. For this reason many programming languages and mathematical systems, among these Fortran, Perl, Python, Scilab, Mathematica and Maple, have chosen right-associativity. Several others, MATLAB and Octave, which is intended to be compatible to MATLAB, use left-associativity. (Microsoft Excel also uses left-associativity, but this product exhibits more quirky arithmetic behaviour and therefore should not be considered as a serious factor, in at least one author's opinion.) ~ Proposal Therefore, given the expectation of programmers, the choice made in many programming languages and mathematical systems and the arguments about the limited usefulness of left-associativity, this TIP proposes to correct the behaviour of the exponentiation operator. It should be right-associative, so that: | 2 ** 3 ** 4 = 2 ** (3 ** 4) = 2 ** 81 = 2417851639229258349412352 (and not 4096, if left-associativity is used) ~ Compatibility No official version of Tcl 8.5 has been released yet. Existing "private" extensions that define an exponentiation operator that we are aware of use the right-associativity as well. Therefore this correction will only enhance compatibility. ~ Copyright This document is placed in the public domain