datibbaw

Tjerk Meesters

Contents

PHP RFC: Power Operator

  • Version: 0.3
  • Date: 2013-11-23
  • Author: Tjerk Meesters, datibbaw@php.net
  • Status: Implemented in PHP 5.6
  • Revision (0.1 → 0.2): 2013-12-19
  • Revision (0.2 → 0.3): 2013-12-21

Introduction

This proposal is two-fold:

  1. Introduce an exponential (right associative) operator **.
    • Avoids a function call.
    • Support for GMP overloading.
    • Easier to read and shorter to write.
    • Can be found in other languages.
  2. Introduce an exponential assignment operator **=

Proposal

A short working example:

echo 2 ** 3; // 8

It supports GMP overloading:

$base = gmp_init(2);
$exponent = 3;
var_dump($base ** $exponent);
 
// output
object(GMP)#3 (1) {
  ["num"]=>
  string(1) "8"
}

Example of exponent assignment:

$x = 2;
$x **= 3;
echo $x; // 8

Important

The proposed associativity is right, just like how power towers work.

The operator precedence is:

  • higher than the bitwise not (~) and unary minus,
  • lower than array dereferencing.

Examples:

echo 2 ** 3 ** 2; // 512 (not 64)
echo -3 ** 2; // -9 (not 9)
echo 1 - 3 ** 2; // -8
echo ~3 ** 2; // -10 (not 16)

Discussion

Should -3 ** 2 evaluate to 9 instead of -9?

According to the following resources, the scale tips more towards having the exponent precede the unary minus:

Similar languages

  • Ada
  • D
  • F#
  • Fortran
  • Freemat
  • Haskell
  • Mathematica / Matlab / Scilab
  • Octave
  • Perl
  • Python
  • R
  • Ruby
  • Sage
  • VB / Basic

Dissimilar languages

  • Bash
  • Cobol
  • ColdFusion
  • Excel
  • Tcl

Should 2 ** 3 ** 2 yield 64 (left associative), 512 (right associative) or throw an error (non associative)?

The exponent operator evaluation order should be based on Tetration and therefore be right associative.

Languages with left associative exponential operator

  • VB (not by choice imho)
  • Basic
  • Octave
  • Matlab
  • ColdFusion

Languages with right associative exponential operator

  • D
  • Haskell
  • R
  • F#
  • Ruby
  • Perl
  • Python
  • Mathematica
  • Freemat
  • Scilab
  • Tcl (changed from left associative!)
  • Cobol
  • Fortran
  • Sage
  • Bash

Languages with non associative exponential operator

  • Ada

Sources

Proposed PHP Version(s)

PHP 5.6

Impact to Existing Extensions

The opcode ZEND_POW <165> and ZEND_ASSIGN_POW <166> is added.

External extensions such as vld or phpdbg would have to be updated, but I'm not aware of any core extensions that would otherwise be affected.

Patches and Tests

Power operator PR: https://github.com/php/php-src/pull/543

PHP 5.6 Commits: 1 2

Versions

Version Changed Date
3 Removed turning pow() into a language construct from the proposal, due to BC breaks.
2 Closed vote and moved RFC back to Discussion status.
1 Reverted commit f60b98c.

Votes

An option needs 50%+1 votes to win

Should PHP get a power operator in 5.6? (71.9% approved)
User Vote
aharvey No
ajf Yes, right associative
auroraeosrose Yes, right associative
bmajdak No
bwoebi Yes, non associative
chobieeee Yes, right associative
cyberspice Yes, right associative
datibbaw Yes, right associative
daverandom Yes, right associative
davey Yes, right associative
derick Yes, right associative
dm Yes, right associative
googleguy Yes, right associative
guilhermeblanco No
kassner Yes, right associative
krakjoe Yes, right associative
kriscraig No
levim Yes, right associative
lstrojny Yes, right associative
mbeccati Yes, right associative
mfonda No
nikic No
peehaa No
philstu Yes, right associative
pollita Yes, right associative
rasmus Yes, right associative
rdlowrey Yes, right associative
salathe Yes, right associative
seld Yes, right associative
stas No
uw No
willfitch Yes, right associative