TIP #274: RIGHT-ASSOCIATIVITY FOR THE EXPONENTIATION OPERATOR =============================================================== Version: $Revision: 1.9 $ Author: Arjen Markus David Smith Richard Suchenwirth Don Porter Sérgio Loureiro State: Final Type: Project Tcl-Version: 8.5 Vote: Done Created: Friday, 15 September 2006 URL: https://tip.tcl-lang.org274.html Post-History: ------------------------------------------------------------------------- ABSTRACT ========== This TIP clarifies and corrects the associativity behaviour of the exponentation operator that was introduced in [TIP #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. [TIP #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 . 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 ------------------------------------------------------------------------- TIP AutoGenerator - written by Donal K. Fellows