rfc:pow-operator

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

rfc:pow-operator [2014/01/06 04:14]
datibbaw
rfc:pow-operator [2017/09/22 13:28]
Line 1: Line 1:
- 
-====== PHP RFC: Power Operator ====== 
-  * Version: 0.3 
-  * Date: 2013-11-23 
-  * Author: Tjerk Meesters, datibbaw@php.net 
-  * Status: Voting 
-  * 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 ''<nowiki>**</nowiki>''. 
-    * 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 ''<nowiki>**=</nowiki>'' 
- 
-===== Proposal ===== 
- 
-A short working example: 
- 
-<code php> 
-echo 2 ** 3; // 8 
-</code> 
- 
-It supports [[operator_overloading_gmp|GMP overloading]]: 
- 
-<code php> 
-$base = gmp_init(2); 
-$exponent = 3; 
-var_dump($base ** $exponent); 
- 
-// output 
-object(GMP)#3 (1) { 
-  ["num"]=> 
-  string(1) "8" 
-} 
-</code> 
- 
-Example of exponent assignment: 
- 
-<code php> 
-$x = 2; 
-$x **= 3; 
-echo $x; // 8 
-</code> 
- 
-**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: 
- 
-<code php> 
-echo 2 ** 3 ** 2; // 512 (not 64) 
-echo -3 ** 2; // -9 (not 9) 
-echo 1 - 3 ** 2; // -8 
-echo ~3 ** 2; // -10 (not 16) 
-</code> 
- 
-===== 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 ''-2 <nowiki>**</nowiki> 3'' 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 <nowiki>**</nowiki> 3 <nowiki>**</nowiki> 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 ''<nowiki>**</nowiki>'' and ''<nowiki>**</nowiki>='', 
-  * Add ''ZEND_POW'' and ''ZEND_ASSIGN_POW'' opcodes. 
- 
-Changes from 0.1: 
- 
-  * A option is added to vote for a non-associative ''<nowiki>**</nowiki>'' operator. See also: Discussion. This counts as an inclusion vote. 
- 
-A two third majority is required for acceptance. 
- 
----- 
- 
-<doodle title="Should PHP get a power operator in 5.6?" auth="datibbaw" voteType="single" closed="true"> 
-   * Yes, right associative 
-   * Yes, non associative 
-   * No 
-</doodle> 
- 
----- 
- 
-Voting ends on 5th of January 2014. 
- 
- 
-===== Patches and Tests ===== 
- 
-Power operator PR: https://github.com/php/php-src/pull/543 
  
rfc/pow-operator.txt · Last modified: 2017/09/22 13:28 (external edit)