TIP 274: Right-Associativity for the Exponentiation Operator

Login
Author:         Arjen Markus <[email protected]>
Author:         David Smith <[email protected]>
Author:         Richard Suchenwirth <[email protected]>
Author:         Don Porter <[email protected]>
Author:         Sérgio Loureiro <[email protected]>
State:          Final
Type:           Project
Vote:		Done
Created:        15-Sep-2006
Post-History:   
Keywords:       Tcl,expr
Tcl-Version:    8.5
Tcl-Ticket:     1556802

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