====== PHP RFC: Power Operator ======
* Version: 0.3
* Date: 2013-11-23
* Author: Tjerk Meesters, datibbaw@php.net
* Status: Implemented in PHP 5.6
* First Published at: http://wiki.php.net/rfc/pow-operator
* Revision (0.1 → 0.2): 2013-12-19
* Revision (0.2 → 0.3): 2013-12-21
===== Introduction =====
This proposal is two-fold:
- Introduce an exponential (right associative) operator ''**''.
* Avoids a function call.
* Support for [[rfc:operator_overloading_gmp|GMP overloading]].
* Easier to read and shorter to write.
* Can be found in other languages.
- Introduce an exponential assignment operator ''**=''
===== Proposal =====
A short working example:
echo 2 ** 3; // 8
It supports [[operator_overloading_gmp|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)
===== Changelog =====
21-Dec-2013:
* Removed turning pow() into a language construct from the proposal, due to BC breaks.
* Closed vote and moved RFC back to Discussion status.
* Reverted commit [[https://github.com/datibbaw/php-src/commit/f60b98cf7a8371233d800a6faa286ddba4432d02|f60b98c]].
22-Dec-2013:
* Moved RFC back to Voting status
===== 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:
* http://mathforum.org/library/drmath/view/53194.html
* http://math.stackexchange.com/questions/491933/exponent-rules-with-negative-numbers
* http://math.stackexchange.com/questions/68833/what-does-22-evaluate-to/68834#68834
**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 [[http://en.wikipedia.org/wiki/Tetration|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**
* https://plus.google.com/u/0/104277466162910953762/posts/e3jCt51VfmD
* http://perldoc.perl.org/perlop.html
* http://www.tcl.tk/cgi-bin/tct/tip/274.html
* http://book.realworldhaskell.org/read/getting-started.html
* http://www.nku.edu/~foxr/CSC407/NOTES/ch7.ppt (second slide)
===== 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 [[http://pecl.php.net/package/vld|vld]] or [[https://github.com/krakjoe/phpdbg|phpdbg]] would have to be updated, but I'm not aware of any core extensions that would otherwise be affected.
===== Vote =====
Voting will be based on the following:
* Add the power operators ''**'' and ''**='',
* Add ''ZEND_POW'' and ''ZEND_ASSIGN_POW'' opcodes.
Changes from 0.1:
* A option is added to vote for a non-associative ''**'' operator. See also: Discussion. This counts as an inclusion vote.
A two third majority is required for acceptance.
----
* Yes, right associative
* Yes, non associative
* No
----
Voting ends on 5th of January 2014.
===== Patches and Tests =====
Power operator PR: https://github.com/php/php-src/pull/543
PHP 5.6 Commits: [[http://git.php.net/?p=php-src.git;a=commit;h=aff56f3c4539869910cf2778cf0ece2d8c2dd671|1]] [[http://git.php.net/?p=php-src.git;a=commit;h=363ff60475d93716722034b8f7a2486229bf4cfb|2]]