Hello everyone. I am new to the php-internals list. I have joined because I have implemented a feature that I would like to be included in the php language: a shorter syntax for lambdas. I am going to briefly present it here. Apologies for the long (and yet incomplete) e-mail. I am ready to write a more complete RFC in the wiki, however, I would appreciate having some directions for that. Do I have to ask for permission first? Is it open to anyone to submit an RFC?
1. NECESSITY: This feature was briefly discussed in this list about a month ago: http://marc.info/?t=130926918200003&r=1&w=2. It is also one of the asked (and upvoted) features in the open stack overflow's discussion: http://programmers.stackexchange.com/questions/27564/what-features-would-you-like-to-have-in-php. Finally, I have written a small and probably incomplete article in my blog about the necessity of a shorter syntax for lambdas: http://linepogl.wordpress.com/2011/07/09/on-the-syntax-of-closures-in-php/ 2. THE CURRENT SYNTAX I give 3 examples with the current syntax: // Mapping: $a->select( function($x){ return $x->getName(); } ); // Filtering: $a->where( function($x)use($y){ return $x==$y; } ); // Currying: $add = function($x){ return function($y)use($x){ return $x+$y; }; }; In my opinion, the above code is not easily readable. Yet, those examples are not very complicated. The first two are samples of elegant LINQ-style code while the last one can be found in the first pages of any functional programming tutorial. 3. PROPOSED SYNTAX The syntax I propose and I have already implemented is this: // Mapping: $a->select( | $x |=> $x->getName() ); // Filtering: $a->where( | $x : $y |=> $x==$y ); // Currying: $add = | $x |=> | $y : $x |=> $x+$y; 4. ADVANTAGES a. The code is more readable (see more in my blog if you are not convinced about that). b. The syntax is backwards compatible. The short lambda and the longer equivalent are interchangeable. c. Variable scoping works exactly like in the longer version. There is nothing new but syntactic sugar. d. Lambda expressions are searchable. The |=> operator is unique. e. The |=> operator is similar to =>. That's good because they both relate to mapping. In addition, the : operator is similar to :: and that's also good because they both relate to scoping. f. The implemented syntax supports type hinting, passing by reference and return by reference. There is also an option to fall back to a statement block if the single return statement is not enough. Therefore is a complete alternative to the existing syntax. 5. DISADVANTAGES a. The short syntax is clear and readable, but can become confusing when used in the wrong places. Yet, isn’t this the case with every feature? b. A lambda without arguments conflicts with the logical or operator. A way to avoid this is to insert whitespace between the two pipes, but this breaks the invariant that whitespace is not important in PHP. Although this use case is not ideal for short lambdas, it can be fixed at the compiler level by introducing the rather long operator ||=>. c. The newly introduced feature of static closures is not yet supported. The short lambdas behave like dynamic closures for the time being. You can download the patch on the 5.4 branch from here: https://bitbucket.org/linepogl/php_short_closures/downloads/short_closures_syntax_0.1_php54.diff I have posted a more complete presentation here: http://linepogl.wordpress.com/2011/08/04/short-closures-for-php-an-implementation/ I am ready to give more examples and to further defend my proposal. However as I am new to your community, I would like to have some directions on the way I should continue. Kind regards, Lazare INEPOLOGLOU Ingénieur Logiciel -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php