====== 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]]