RE: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
See below: -Original Message- From: Christian Seiler [mailto:[EMAIL PROTECTED] Sent: Wednesday, June 18, 2008 1:14 PM To: php-dev List Subject: Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP Frankly, I don't really see a problem with using references. It fits into what's already there in PHP and it assures that closures have the necessary properties to make them useful. I think you are right that there isn't really a good alternative as the parent scope does not necessarily exist anymore. Your solution is likely the best. - Please check eval(). I assume it will bind to global scope but let's just make sure what happens esp. when it's called from within a method... Hmm, closures inside eval() will bind variables to the scope in which eval() was called. But closures defined inside eval will NOT be class methods, even if eval() is called within a class. But I do find that behaviour consistent with what PHP currently does with normal functions and variables: If eval()'d or include()'d inside a function, variables will the global scope of eval() or the included file will actually be the local function scope whereas defined functions inside will automatically become global functions. Of course, this behaviour should be documented but I don't see a reason to try and change it. I agree. It behaves as I would expect I just wanted to make sure you verify that because I didn't have the opportunity to do so. You'd actually have to work very hard for it not to behave in that way :) Let's just make sure we have unit tests for both cases just so we have a good regression on this one. - In PHP 5, object storage is resources done right. I don't think we should be using the resource infrastructure for this implementation and would prefer to use the object one. It's better. I suggest to take a look at it. Hmm, seems like a good idea. If nobody objects in the next few days, I'll rewrite my patch to use objects instead of resources. What class name do you suggest? Great. I think Closure is probably a good name. [Btw, if we want to get fancy we could even have a __toString() method on those which would print out information about the Closure. But this is not a must, just something which eventually could be nice for debugging purposes...] PS: Somebody made me aware of a segfault in my code when destroying the closure variable while still inside the closure. I'll fix that. :) Thanks, Andi
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
On Thu, Jun 19, 2008 at 8:44 AM, Andi Gutmans [EMAIL PROTECTED] wrote: - In PHP 5, object storage is resources done right. I don't think we should be using the resource infrastructure for this implementation and would prefer to use the object one. It's better. I suggest to take a look at it. Hmm, seems like a good idea. If nobody objects in the next few days, I'll rewrite my patch to use objects instead of resources. What class name do you suggest? Great. I think Closure is probably a good name. [Btw, if we want to get fancy we could even have a __toString() method on those which would print out information about the Closure. But this is not a must, just something which eventually could be nice for debugging purposes...] Using objects, instead of resources is an excellent idea. Would it be possible to introduce a general __invoke (Or whatever name is more fitting) magic-method, so that whichever object implements that method, is callable with call_user_func (and directly through variable-function-syntax). Eg.: class Foo { function __invoke($thing) { echo Foo: . $thing; } } $foo = new Foo(); $foo(bar); // echoes Foo: bar I'm not sure how this would play together with lexical scope? -- troels -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
Hi Christian, I took a look into your patch and found it too difficult. So I implemented another patch (attached) which is based on your ideas. From user's level of view it does exactly the same except for lexical variables definition. I don't use any new reserver word because every new reserved word is going to break some user code. I use the special syntax for lambda function definition instead, which looks much clear for me. The following code creates a lambda function with arguments $x, $y and lexical variables $a, $b, $c. $a = function($x, $y | $a, $b $c) {}; The patch shouldn't affect opcode caches and other extensions as it doesn't change any structures. It uses the op_array-static_variables for lexical variables. The patch also fixes several small issues and adds some missing functionality which didn't allow preg_replace_callback() (and may be others) to work with lambda functions. Now the following example works fine. ?php class X { private function foo($x) { echo $x; } function bar($s) { return function ($x | $s) { static $n = 0; $n++; $s = $n.':'.$s; $this-foo($x[0].':'.$s); }; } } $x = new X; $x = $x-bar(bye\n); $s = 'abc'; preg_replace_callback('/[abc]/', $x, $s); ? It prints: a:1:bye b:2:1:bye c:3:2:1:bye Of course the patch doesn't break any existent tests. Please review. Thanks. Dmitry. Christian Seiler wrote: Hi, As a followup to the discussion in January, I'd like post a revised patch to this list that implements closures and anonymous functions in PHP. INTRODUCTION Closures and lambda functions can make programming much easier in several ways: 1. Lambda functions allow the quick definition of throw-away functions that are not used elsewhere. Imaging for example a piece of code that needs to call preg_replace_callback(). Currently, there are three possibilities to acchieve this: a. Define the callback function elsewhere. This distributes code that belongs together throughout the file and decreases readability. b. Define the callback function in-place (but with a name). In that case one has to use function_exists() to make sure the function is only defined once. Example code: ?php function replace_spaces ($text) { if (!function_exists ('replace_spaces_helper')) { function replace_spaces_helper ($matches) { return str_replace ($matches[1], ' ', 'nbsp;').' '; } } return preg_replace_callback ('/( +) /', 'replace_spaces_helper', $text); } ? Here, the additional if() around the function definition makes the source code difficult to read. c. Use the present create_function() in order to create a function at runtime. This approach has several disadvantages: First of all, syntax highlighting does not work because a string is passed to the function. It also compiles the function at run time and not at compile time so opcode caches can't cache the function. 2. Closures provide a very useful tool in order to make lambda functions even more useful. Just imagine you want to replace 'hello' through 'goodbye' in all elements of an array. PHP provides the array_map() function which accepts a callback. If you don't wan't to hard-code 'hello' and 'goodbye' into your sourcecode, you have only four choices: a. Use create_function(). But then you may only pass literal values (strings, integers, floats) into the function, objects at best as clones (if var_export() allows for it) and resources not at all. And you have to worry about escaping everything correctly. Especially when handling user input this can lead to all sorts of security issues. b. Write a function that uses global variables. This is ugly, non-reentrant and bad style. c. Create an entire class, instantiate it and pass the member function as a callback. This is perhaps the cleanest solution for this problem with current PHP but just think about it: Creating an entire class for this extremely simple purpose and nothing else seems overkill. d. Don't use array_map() but simply do it manually (foreach). In this simple case it may not be that much of an issue (because one simply wants to iterate over an array) but there are cases where doing something manually that a function with a callback as parameter does for you is quite tedious. [Yes, I know that str_replace also accepts arrays as a third parameter so this example may be a bit useless. But imagine you want to do a more complex operation than simple search and replace.] PROPOSED PATCH
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
I'd prefer a run-tests.php option that sets the timeout limit in seconds. Nice idea, but I'm not sure it's achievable under CLI. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
Hi Travis, All it does is adds another option, -x, to run-tests.php. This sets an environmental variable which can then be checked for in the SKIPIF section of very slow-running tests. How do you specify that test A is slow? Is there a certain skipif message you include, or...? Yep. The two that bug me most are actually labelled 'slow test', so having a skipif condition for those wouldn't be too obscure. Note that it's only intended for when you're repeatedly running the same group of tests... I like Chris's idea better, but can't see a way to implement it. There's probably something really obvious I'm missing, let me know if. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
Hey Stas, +$environment['EXEMPT_SLOW_TESTS'] = 1; Maybe SKIP_SLOW_TESTS? If it's checked in skip section... :) Otherwise - good idea! You can tell I'm reading my mail backwards today... I used 'EXEMPT' because the option is 'x' and I wanted it to be easy to remember. 's' wasn't available. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
I'd prefer a run-tests.php option that sets the timeout limit in seconds. Nice idea, but I'm not sure it's achievable under CLI. Yes, it is. Check the system_with_timeout() function in the run-tests.php script. There you've the timeout hardcoded ('$leak_check ? 300 : 60'). You would just need to make it configurable by some environment var. Nuno -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
Yes, it is. Check the system_with_timeout() function in the run-tests.php script. There you've the timeout hardcoded ('$leak_check ? 300 : 60'). You would just need to make it configurable by some environment var. I already tried hard-coding both tv_sec and tv_usec to 0 and it makes no difference here. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] Disable mysqlnd in PHP5.3.0
Just trying to work out why my footprint was bigger than I expected running the windows 5.3.0-dev and I've got mysqlnd installed when I don't need it. How do I get rid of it or am I going have to compile my own builds in future? -- Lester Caine - G8HFL - Contact - http://lsces.co.uk/lsces/wiki/?page=contact L.S.Caine Electronic Services - http://lsces.co.uk EnquirySolve - http://enquirysolve.com/ Model Engineers Digital Workshop - http://medw.co.uk// Firebird - http://www.firebirdsql.org/index.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Lester Caine wrote: Just trying to work out why my footprint was bigger than I expected running the windows 5.3.0-dev and I've got mysqlnd installed when I don't need it. How do I get rid of it or am I going have to compile my own builds in future? It's on by default on windows, so you'll have to compile your own builds if you don't want it - use the --without-mysqlnd flag on windows -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Elizabeth M Smith wrote: Lester Caine wrote: Just trying to work out why my footprint was bigger than I expected running the windows 5.3.0-dev and I've got mysqlnd installed when I don't need it. How do I get rid of it or am I going have to compile my own builds in future? It's on by default on windows, so you'll have to compile your own builds if you don't want it - use the --without-mysqlnd flag on windows Another reason not to switch to 5.3? :( Any particular reason why it's been changed - I can't see anything I need it for. -- Lester Caine - G8HFL - Contact - http://lsces.co.uk/lsces/wiki/?page=contact L.S.Caine Electronic Services - http://lsces.co.uk EnquirySolve - http://enquirysolve.com/ Model Engineers Digital Workshop - http://medw.co.uk// Firebird - http://www.firebirdsql.org/index.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
On Thu, Jun 19, 2008 at 2:39 PM, Lester Caine [EMAIL PROTECTED] wrote: Elizabeth M Smith wrote: Lester Caine wrote: Just trying to work out why my footprint was bigger than I expected running the windows 5.3.0-dev and I've got mysqlnd installed when I don't need it. How do I get rid of it or am I going have to compile my own builds in future? It's on by default on windows, so you'll have to compile your own builds if you don't want it - use the --without-mysqlnd flag on windows Another reason not to switch to 5.3? :( Come on. Mysql has been always been enabled by default. Any particular reason why it's been changed - I can't see anything I need it for. It is the main library used by all mysql modules, it replaces libmysql. Cheers, -- Pierre http://blog.thepimp.net | http://www.libgd.org -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Any particular reason why it's been changed - I can't see anything I need it for. The other million or so who do. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Pierre Joye wrote: On Thu, Jun 19, 2008 at 2:39 PM, Lester Caine [EMAIL PROTECTED] wrote: Elizabeth M Smith wrote: Lester Caine wrote: Just trying to work out why my footprint was bigger than I expected running the windows 5.3.0-dev and I've got mysqlnd installed when I don't need it. How do I get rid of it or am I going have to compile my own builds in future? It's on by default on windows, so you'll have to compile your own builds if you don't want it - use the --without-mysqlnd flag on windows Another reason not to switch to 5.3? :( Come on. Mysql has been always been enabled by default. *NO* Mysql was REMOVED as the default in 5.0.0 after lots of requests from those of us who don't want it loaded. There was a democratic decision to remove it. Any particular reason why it's been changed - I can't see anything I need it for. It is the main library used by all mysql modules, it replaces libmysql. And should only be load if MySQl is required ... -- Lester Caine - G8HFL - Contact - http://lsces.co.uk/lsces/wiki/?page=contact L.S.Caine Electronic Services - http://lsces.co.uk EnquirySolve - http://enquirysolve.com/ Model Engineers Digital Workshop - http://medw.co.uk// Firebird - http://www.firebirdsql.org/index.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] Overloading
What about the addition of overloading for PHP 6? I am not totally up to date on the developments of the parameter type hints. I briefly read the meeting minutes for PHP 6. What about with the type hints we have now? class moo { public static function foo(FooClass $FooVar) { // do something } public static function foo(BooClass $BooVar) { // do something } } I have a project where we had to do a sort of pseudo overloading Class moo { /** * Accept the superclass or any of its sub classes */ public static function foo(FooSuperClass $Foo) { switch (true) { case $Foo instanceof FooClass: $method = 'fooFoo'; break; case $Foo instanceof BooClass: $method = 'fooBoo'; break; default: throw new Exception('Unrecognized type: ' . get_class($Foo)); break; } call_user_func(array(self, $method), $Foo); } private static function fooFoo(FooClass $FooVar) { // do something } private static function fooBoo(BooClass $BooVar) { // do something } } Mark -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
On Jun 19, 2008, at 7:07 AM, Steph Fox wrote: Yes, it is. Check the system_with_timeout() function in the run- tests.php script. There you've the timeout hardcoded ('$leak_check ? 300 : 60'). You would just need to make it configurable by some environment var. I already tried hard-coding both tv_sec and tv_usec to 0 and it makes no difference here. I can add this to PHPT - it uses a timeout based on reading the open proc. The only problem is that it is currently treated as an error. I could maybe add a new reporting level of timeout, though I do like the idea of having some sort of meta-data to conditionally skip tests. Maybe a better solution is to add an --exclude pattern and ask people to either place potentially slow tests in tests/slow/, or name then test case.slow.phpt? Being able to exclude a pattern of test names definitely has more use than just setting a timeout. Thoughts? -T -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Come on. Mysql has been always been enabled by default. *NO* Mysql was REMOVED as the default in 5.0.0 after lots of requests from those of us who don't want it loaded. There was a democratic decision to remove it. *NO*. MySQL was no longer bundled from 5.0.0 because MySQL AB went GPL on us. The mysqlnd library is their resolution for that problem. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
Yes, it is. Check the system_with_timeout() function in the run-tests.php script. There you've the timeout hardcoded ('$leak_check ? 300 : 60'). You would just need to make it configurable by some environment var. I already tried hard-coding both tv_sec and tv_usec to 0 and it makes no difference here. uhm, file a bug report then. It was supposed to work.. Nuno -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
uhm, file a bug report then. It was supposed to work.. There are some open on this already. Also - Windows is the only environment where we actually have control over whether it works or not. Everything else relies on a system call. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Steph Fox wrote: Come on. Mysql has been always been enabled by default. *NO* Mysql was REMOVED as the default in 5.0.0 after lots of requests from those of us who don't want it loaded. There was a democratic decision to remove it. *NO*. MySQL was no longer bundled from 5.0.0 because MySQL AB went GPL on us. The mysqlnd library is their resolution for that problem. MySQL was replaced by SQLite as the default database in the very first release of 5.0.0 http://www.php.net/ChangeLog-5.php#5.0.0b1 The PRIMARY reason was because of the number of non MySQL users who requested that. CURRENTLY the default sql connection is SQLite so there is no need to add back in another option. The changes to the licence conditions just made the CHANGE of database easier ;) MySQL should NOT be loaded by default as well as SQLite. -- Lester Caine - G8HFL - Contact - http://lsces.co.uk/lsces/wiki/?page=contact L.S.Caine Electronic Services - http://lsces.co.uk EnquirySolve - http://enquirysolve.com/ Model Engineers Digital Workshop - http://medw.co.uk// Firebird - http://www.firebirdsql.org/index.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
Hi Dmitry, As a lowly userspace developer, the | syntax is a bit confusing. If I see $x, $y | $a, $b, $c, my brain parses it as ($a, ($y | $a), $b, $c), since , has lower precedence than |. I'd think syntax error, then logical OR, but never this refers to the variables I want imported to inside the closures. Also, I'd like lexical a bit more for the same reasons discussed in the short array syntax ([1,2]) topic: a user faced with function($x, $y | $a, $b, $c) has nowhere to search for what | means. I do, however, see the benefit of not changing the scanner and not breaking opcode caches. Would reusing parent be too much of a wtf? Having little idea of how the internals work, would it be too complicated to hook - so if you say $obj-var(), and var holds a lambda function, for that function to be called instead of throwing a syntax error? I know it seems hackish to add methods at runtime, but this would be to runkit's method addition what lambdas are to create_function. IMO it would seem a bit more logical, if $obj-f = function(){echo foo;};, to be able to do $obj-f() instead of $f = $obj-f; $f();, and knowing that $f() won't have access to $this (or at least, I wouldn't suppose it would in the second case). I also agree that shipping it with 5.3 would be a bit too rushed, since this, like any other feature, needs to be debugged thoroughly if it's going into production (and going to change the API). 5.4 and 6.0 don't seem so bad, though. - Federico Lebron Dmitry Stogov wrote: Hi Christian, I took a look into your patch and found it too difficult. So I implemented another patch (attached) which is based on your ideas. From user's level of view it does exactly the same except for lexical variables definition. I don't use any new reserver word because every new reserved word is going to break some user code. I use the special syntax for lambda function definition instead, which looks much clear for me. The following code creates a lambda function with arguments $x, $y and lexical variables $a, $b, $c. $a = function($x, $y | $a, $b $c) {}; The patch shouldn't affect opcode caches and other extensions as it doesn't change any structures. It uses the op_array-static_variables for lexical variables. The patch also fixes several small issues and adds some missing functionality which didn't allow preg_replace_callback() (and may be others) to work with lambda functions. Now the following example works fine. ?php class X { private function foo($x) { echo $x; } function bar($s) { return function ($x | $s) { static $n = 0; $n++; $s = $n.':'.$s; $this-foo($x[0].':'.$s); }; } } $x = new X; $x = $x-bar(bye\n); $s = 'abc'; preg_replace_callback('/[abc]/', $x, $s); ? It prints: a:1:bye b:2:1:bye c:3:2:1:bye Of course the patch doesn't break any existent tests. Please review. Thanks. Dmitry. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
There's nothing wrong with that approach. I'm trying to find something that addresses the problem (i.e., how can I not run tests that are going to take a long time to run?), while providing enough flexibility to answer other problems (i.e., how can I skip X tests that I don't care about?). If there's a way to address the problem without making it so specific, I'm all for it. I mostly agree - I'm just looking at 'here and now' rather than 'when the nice new test suite stuff is done'. 'Here and now', there isn't a reliable way to set this up and skipif looks like the cleanest option. I think the naming thing would be a better idea for something that's just starting out. It's a less good idea for a test suite that already exists IMHO. Agreed. If we were to go this route, I'd actually consider adding a run-tests.ini or some such that allows you to configure things like excluded file patterns. That might not be a bad idea. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
MySQL was replaced by SQLite as the default database in the very first release of 5.0.0 http://www.php.net/ChangeLog-5.php#5.0.0b1 Yes. The PRIMARY reason was because of the number of non MySQL users who requested that. No. Will you please stop trying to rewrite history. There was an outcry when MySQL was unbundled - you were probably the only PHP user who was happy about it :) - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
Steph Fox wrote: So what was wrong with the simple skipif and env var approach again? The problem is it only skips the test! I'd like my slow tests to run (this generally occurs when I use a very remote DB). I end up manually increasing the timeout in stream_select() in run-tests.sh. This works for me on Linux. If we make the timeout value adjustable, you can set it to a low value so your slow tests are quickly aborted, and I can set it to a high value so my tests are run. Chris -- Christopher Jones, Oracle Email: [EMAIL PROTECTED]Tel: +1 650 506 8630 Blog: http://blogs.oracle.com/opal/ Free PHP Book: http://tinyurl.com/f8jad -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
On Thu, Jun 19, 2008 at 2:49 PM, Lester Caine [EMAIL PROTECTED] wrote: Pierre Joye wrote: On Thu, Jun 19, 2008 at 2:39 PM, Lester Caine [EMAIL PROTECTED] wrote: Elizabeth M Smith wrote: Lester Caine wrote: Just trying to work out why my footprint was bigger than I expected running the windows 5.3.0-dev and I've got mysqlnd installed when I don't need it. How do I get rid of it or am I going have to compile my own builds in future? It's on by default on windows, so you'll have to compile your own builds if you don't want it - use the --without-mysqlnd flag on windows Another reason not to switch to 5.3? :( Come on. Mysql has been always been enabled by default. *NO* Mysql was REMOVED as the default in 5.0.0 after lots of requests from those of us who don't want it loaded. There was a democratic decision to remove it. I was not clear. Mysql has been (and still is) always enabled and available by default in our Windows binaries. It is the main library used by all mysql modules, it replaces libmysql. And should only be load if MySQl is required ... Agreed, but I do not maintain mysqlnd (and not willing to :), can you open a bug about that please? Cheers, -- Pierre http://blog.thepimp.net | http://www.libgd.org -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
I don't like lexical keyword, because it can be used anywhere in function (e.q. inside if or loop statement), however lexical variables must be the part of lambda function definition. We can think about some better syntax, like function ($x, $y) ($a, $b, $c) {}; function ($x, $y) [$a, $b, $c] {}; I like | separator more, but the syntax of definition is not so important for me. It just must be clean, and the lexical keyword doesn't provide clean definition. I don't like the idea to add methods at runtime, as it can break shared data structures in multi-threaded environment. Thanks. Dmitry. Federico Lebron wrote: Hi Dmitry, As a lowly userspace developer, the | syntax is a bit confusing. If I see $x, $y | $a, $b, $c, my brain parses it as ($a, ($y | $a), $b, $c), since , has lower precedence than |. I'd think syntax error, then logical OR, but never this refers to the variables I want imported to inside the closures. Also, I'd like lexical a bit more for the same reasons discussed in the short array syntax ([1,2]) topic: a user faced with function($x, $y | $a, $b, $c) has nowhere to search for what | means. I do, however, see the benefit of not changing the scanner and not breaking opcode caches. Would reusing parent be too much of a wtf? Having little idea of how the internals work, would it be too complicated to hook - so if you say $obj-var(), and var holds a lambda function, for that function to be called instead of throwing a syntax error? I know it seems hackish to add methods at runtime, but this would be to runkit's method addition what lambdas are to create_function. IMO it would seem a bit more logical, if $obj-f = function(){echo foo;};, to be able to do $obj-f() instead of $f = $obj-f; $f();, and knowing that $f() won't have access to $this (or at least, I wouldn't suppose it would in the second case). I also agree that shipping it with 5.3 would be a bit too rushed, since this, like any other feature, needs to be debugged thoroughly if it's going into production (and going to change the API). 5.4 and 6.0 don't seem so bad, though. - Federico Lebron Dmitry Stogov wrote: Hi Christian, I took a look into your patch and found it too difficult. So I implemented another patch (attached) which is based on your ideas. From user's level of view it does exactly the same except for lexical variables definition. I don't use any new reserver word because every new reserved word is going to break some user code. I use the special syntax for lambda function definition instead, which looks much clear for me. The following code creates a lambda function with arguments $x, $y and lexical variables $a, $b, $c. $a = function($x, $y | $a, $b $c) {}; The patch shouldn't affect opcode caches and other extensions as it doesn't change any structures. It uses the op_array-static_variables for lexical variables. The patch also fixes several small issues and adds some missing functionality which didn't allow preg_replace_callback() (and may be others) to work with lambda functions. Now the following example works fine. ?php class X { private function foo($x) { echo $x; } function bar($s) { return function ($x | $s) { static $n = 0; $n++; $s = $n.':'.$s; $this-foo($x[0].':'.$s); }; } } $x = new X; $x = $x-bar(bye\n); $s = 'abc'; preg_replace_callback('/[abc]/', $x, $s); ? It prints: a:1:bye b:2:1:bye c:3:2:1:bye Of course the patch doesn't break any existent tests. Please review. Thanks. Dmitry. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
Hi Chris, If we make the timeout value adjustable, you can set it to a low value so your slow tests are quickly aborted, and I can set it to a high value so my tests are run. It's easily enough done, it's just a separate issue. I can easily put a workaround in the Windows version of select.c to make a 0-second timeout work, but that's as far as it goes. The problem in run-tests (if anyone's interested - Travis seems to have a better solution) is that the actual read is always only 8192 bytes, and the actual API call never times out because stream_select() is reset at every iteration and called afresh. We'd need to be able to set a timeout limit in the run-tests script rather than in the call to stream_select(). And if we do that the tests of course fail, which isn't a good outcome. So 'skipif' suits my needs better, but not yours. I'll add both. - Steph Chris -- Christopher Jones, Oracle Email: [EMAIL PROTECTED]Tel: +1 650 506 8630 Blog: http://blogs.oracle.com/opal/ Free PHP Book: http://tinyurl.com/f8jad -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
I was not clear. Mysql has been (and still is) always enabled and available by default in our Windows binaries. Not now, and not for a very long time. Agreed, but I do not maintain mysqlnd (and not willing to :), can you open a bug about that please? It's not a bug. It was a democratic decision taken in the early days of 5.3. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Steph Fox wrote: MySQL was replaced by SQLite as the default database in the very first release of 5.0.0 http://www.php.net/ChangeLog-5.php#5.0.0b1 Yes. The PRIMARY reason was because of the number of non MySQL users who requested that. No. Will you please stop trying to rewrite history. There was an outcry when MySQL was unbundled - you were probably the only PHP user who was happy about it :) And every other non-MySQL database user. http://uk.php.net/manual/en/faq.databases.php#faq.databases.mysql.php5 outlines some of the 'problems' but I can't find the other requests in the list archive. Although I have found ones from 2003 where I tell people HOW to enable MySQL again. I think the initial problem was that the extensions were not available for MySQL initially and took a while to appear? WHY can't MySQL simply stay in the extensions with the rest of the database extensions. Why does it have to have preferential treatment? If applications need a little database to work they use SQLite otherwise we load a suitable alternative of our choice! -- Lester Caine - G8HFL - Contact - http://lsces.co.uk/lsces/wiki/?page=contact L.S.Caine Electronic Services - http://lsces.co.uk EnquirySolve - http://enquirysolve.com/ Model Engineers Digital Workshop - http://medw.co.uk// Firebird - http://www.firebirdsql.org/index.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
On Jun 19, 2008, at 9:03 AM, Steph Fox wrote: There's nothing wrong with that approach. I'm trying to find something that addresses the problem (i.e., how can I not run tests that are going to take a long time to run?), while providing enough flexibility to answer other problems (i.e., how can I skip X tests that I don't care about?). If there's a way to address the problem without making it so specific, I'm all for it. I mostly agree - I'm just looking at 'here and now' rather than 'when the nice new test suite stuff is done'. 'Here and now', there isn't a reliable way to set this up and skipif looks like the cleanest option. The only problem with that is everything you add I've got to add to my GSoC project so PHPT :-) That might not be a bad idea. I think the long-term goal should be the ability to force skip files based on an --exclude parameter, an ini conf file (looks for -- ini-file file or cwd/tests.ini), and an ENV variable. The first and last would just be separated by the PATH_SEPARATOR for regex patterns. In addition, we can definitely make the time-out something that's settable via the command line and conf, but as you noted in your next email, that is a separate issue. I've created a few tickets on these so we can make sure to track these issues: * add exclude: http://phpt.info/ticket/69 * add timeout: http://phpt.info/ticket/70 -T -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Steph Fox wrote: I was not clear. Mysql has been (and still is) always enabled and available by default in our Windows binaries. Not now, and not for a very long time. Agreed, but I do not maintain mysqlnd (and not willing to :), can you open a bug about that please? It's not a bug. It was a democratic decision taken in the early days of 5.3. LINKS? In fact I can see YOU commenting that it should not be enabled by default! But that was 2007 - I see no agreement that it should be later ? I will be opening a bug - if only to flag the need for a switch to disable it if it's not required. -- Lester Caine - G8HFL - Contact - http://lsces.co.uk/lsces/wiki/?page=contact L.S.Caine Electronic Services - http://lsces.co.uk EnquirySolve - http://enquirysolve.com/ Model Engineers Digital Workshop - http://medw.co.uk// Firebird - http://www.firebirdsql.org/index.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
On Thu, Jun 19, 2008 at 4:37 PM, Dmitry Stogov [EMAIL PROTECTED] wrote: I don't like lexical keyword, because it can be used anywhere in function (e.q. inside if or loop statement), however lexical variables must be the That does sound wtf-y, indeed. Is that allowed with the global keyword? Even if it is, I think it would be a sane limitation to put on lexical, that it must come at the beginning of a function body (Perhaps allowing global and static to precede it). -- troels -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
In fact I can see YOU commenting that it should not be enabled by default! But that was 2007 - I see no agreement that it should be later ? mysqlnd needs to be built-in statically. I will be opening a bug - if only to flag the need for a switch to disable it if it's not required. We have that. --disable-mysqlnd. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] make it possible to skip very slow tests
Steph Fox wrote: So 'skipif' suits my needs better, but not yours. I'll add both. Thanks Steph. Chris -- Christopher Jones, Oracle Email: [EMAIL PROTECTED]Tel: +1 650 506 8630 Blog: http://blogs.oracle.com/opal/ Free PHP Book: http://tinyurl.com/f8jad -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
I was not clear. Mysql has been (and still is) always enabled and available by default in our Windows binaries. Not now, and not for a very long time. Can we stop with the nitpicking? mysql has been available. To paraphrase Meatloaf, one out of three ain't bad :) Agreed, but I do not maintain mysqlnd (and not willing to :), can you open a bug about that please? It's not a bug. It was a democratic decision taken in the early days of 5.3. To have it by default, to have it always even when using --disable-all and no mysql extensions are enabled? yes, it is bug. Can you build it as shared? I can't actually get --disable-all to work here, it keeps shouting about objects-out-dir being 'no'. - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [RFC] Strict type hints (parameter and return value)
What if by type hint a parameter, php automatically tries to convert the argument into that type and throws an exception ONLY if it couldn't be done? for example: function concat(string $a, string $b) { return $a.$b; } I can do: concat(1,'1'); concat(2.5,' pigs'); concat(new ConvertibleToStringObject, 15); But if I do: concat(new NonConvertibleToStringObject, 15); PHP throws an exception saying the function needs a string, but the parameter couldn't be converted... Can this make everybody happy? Cheers, Saulo Vallory On Wed, Jun 18, 2008 at 9:30 PM, Edward Z. Yang [EMAIL PROTECTED] wrote: Fabrice VIGNALS wrote: In mathematic, equal meen the same value AND the same nature. The follow fact could be frustrating : Usually, context is good enough to disambiguate between the cases. The most prevalent convention in programming languages is = is assignment, and == is comparison (PHP adds === only because of its type-juggling system). Other languages have = as comparison, and := as assignment. Donald Knuth uses = as comparison, and a left arrow (-) for assignment. -- Edward Z. YangGnuPG: 0x869C48DA HTML Purifier http://htmlpurifier.org Anti-XSS Filter [[ 3FA8 E9A9 7385 B691 A6FC B3CB A933 BE7D 869C 48DA ]] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Overloading
I'm developing a PHP framework and had the same issue sometimes... I think it was already discussed in the list, did you searched the archives? Saulo On Thu, Jun 19, 2008 at 9:58 AM, Tinsley, Mark [EMAIL PROTECTED] wrote: What about the addition of overloading for PHP 6? I am not totally up to date on the developments of the parameter type hints. I briefly read the meeting minutes for PHP 6. What about with the type hints we have now? class moo { public static function foo(FooClass $FooVar) { // do something } public static function foo(BooClass $BooVar) { // do something } } I have a project where we had to do a sort of pseudo overloading Class moo { /** * Accept the superclass or any of its sub classes */ public static function foo(FooSuperClass $Foo) { switch (true) { case $Foo instanceof FooClass: $method = 'fooFoo'; break; case $Foo instanceof BooClass: $method = 'fooBoo'; break; default: throw new Exception('Unrecognized type: ' . get_class($Foo)); break; } call_user_func(array(self, $method), $Foo); } private static function fooFoo(FooClass $FooVar) { // do something } private static function fooBoo(BooClass $BooVar) { // do something } } Mark -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Re: Disable mysqlnd in PHP5.3.0
Steph Fox wrote: Can you build it as shared? I can't actually get --disable-all to work here, it keeps shouting about objects-out-dir being 'no'. - Steph Ah, shoot, the disable-all thing... that's a configure bug steph, and I have a patch to fix it sitting around here somewhere Elizabeth -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] Fw: [PHP-CVS] cvs: php-src(PHP_5_3) /win32/build confutils.js
Hey Jani, You can run but you can't hide ;) I'm assuming this is down to you, since you moved ereg. I won't even pretend to understand browscap. Please remember to kill this build exclusion if/when you fix it? Thanks, - Steph - Original Message - From: Steph Fox [EMAIL PROTECTED] To: [EMAIL PROTECTED] Sent: Thursday, June 19, 2008 6:43 PM Subject: [PHP-CVS] cvs: php-src(PHP_5_3) /win32/build confutils.js sfox Thu Jun 19 17:43:38 2008 UTC Modified files: (Branch: PHP_5_3) /php-src/win32/build confutils.js Log: - ext/standard currently has a dependency on ext/ereg thanks to browscap.c http://cvs.php.net/viewvc.cgi/php-src/win32/build/confutils.js?r1=1.60.2.1.2.8.2.12r2=1.60.2.1.2.8.2.13diff_format=u Index: php-src/win32/build/confutils.js diff -u php-src/win32/build/confutils.js:1.60.2.1.2.8.2.12 php-src/win32/build/confutils.js:1.60.2.1.2.8.2.13 --- php-src/win32/build/confutils.js:1.60.2.1.2.8.2.12 Thu Jun 19 17:14:43 2008 +++ php-src/win32/build/confutils.js Thu Jun 19 17:43:38 2008 @@ -17,7 +17,7 @@ +--+ */ -// $Id: confutils.js,v 1.60.2.1.2.8.2.12 2008/06/19 17:14:43 sfox Exp $ +// $Id: confutils.js,v 1.60.2.1.2.8.2.13 2008/06/19 17:43:38 sfox Exp $ var STDOUT = WScript.StdOut; var STDERR = WScript.StdErr; @@ -347,7 +347,7 @@ var snapshot_build_exclusions = new Array( 'debug', 'crt-debug', 'lzf-better-compression', - 'php-build', 'snapshot-template', + 'php-build', 'snapshot-template', 'ereg', 'pcre-regex', 'fastcgi', 'force-cgi-redirect', 'path-info-check', 'zts', 'ipv6', 'memory-limit', 'zend-multibyte', 'fd-setsize', 'memory-manager', 't1lib' -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] deprecation status of $str{42} versus $str[42]
That's why there is TextIterator. And it's also much faster (in PHP 6) than iterating through string using indexes. -Andrei Stefan Walk wrote: On Tuesday 17 June 2008 08:27:37 Arvids Godjuks wrote: 2008/6/16 Edward Z. Yang [EMAIL PROTECTED]: PHP userland code may not treat strings as first class arrays, but that's certainly how they are represented internally. Anyway, it would be neat if we could get that foreach syntax to work. I get sick of for($i = 0, $c = strlen($str); $i $c; $i++) very quickly. Totaly agree, the best example from the whole thread You're not learning from the mistakes of other languages (ruby in this case, which removed Enumerable from String in 1.9) ... foreach makes no sense for strings, because it's unclear what you want (with unicode terminology here, as this is for php6): for each byte for each codeunit for each codepoint, or for each line, or ... if you want to use foreach in your example, just do foreach (str_split($str) as $value) { ... Regards, Stefan -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [RFC] Strict type hints (parameter and return value)
Hi, I like this generally, but cannot live with the BC issues raised. Introducing all type names as keywords will make class Object, class Integer and so on give a syntax error. That's actually not true, the patch does not introduce new keywords. Hrm, the Wiki states it does: http://wiki.php.net/rfc/typehint#bc_break1 If this can be worked out by other means, cool:) - Timm -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] extensions status, to move to pecl or to drop
Hi, been busy again at work, sorry for the late answer. I can look into setting up a cruise-control-like infrastructure on our dev-machines that'll run these periodically. Thanks for the offer, that would be very helpful. Is it possible to have it for windows as well? It could also help if we can get one access to fix the possible bugs, as I don't have any sybase licenses or access to any kind of Sybase server (other developers neither). I think it could be done on Windows also - let's see if my budget allows for a Windows testing machine - if not, I'll (shh) use the production server:) - Timm -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] unix path separators in spl
The attached patch implements spl_unixify_path_separators(). If it's I'm afraid that automatically applying slash conversions to all results returned by SPL file functions - if that's what this patch does - may be unwanted. This way SPL functions and regular file functions would return different file names, which can be harmful if these names are used as keys, compared, etc. Paths. Mm, possibly. On the other hand, the only code likely to be broken would be platform-specific code written for Windows boxes - how much of that is likely to be out there? Another point is that, although Windows *writes* '\', these days it's capable of recognising either separator. So it really would just be down to path comparisons. I'm actually wondering how much harm it would do to make DEFAULT_SLASH generic... - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] unix path separators in spl
Hi! Windows even if my application was written in most generic way. Do I miss something? Doesn't PATH_SEPARATOR use DEFAULT_SLASH? Should be DIRECTORY_SEPARATOR and it's \ on windows (PATH_SEPARATOR is ; ). Do you propose to change it to /? Path comparison is important. I thought so too until I couldn't find any broken tests. With all due respect to phpt, these are very primitive code samples testing very narrow functional areas. They do not come anywhere near the stuff people do in real-life apps, combining different functions and extensions. -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] unix path separators in spl
Hello Steph, how about having this as an option inside the SPL classes that gets turned on by Phar automatically? Inside SPL we could have it as a user set-only flag. marcus Wednesday, June 18, 2008, 10:28:40 PM, you wrote: Index: ext/spl/spl_directory.c === RCS file: /repository/php-src/ext/spl/spl_directory.c,v retrieving revision 1.45.2.27.2.23.2.22 diff -u -r1.45.2.27.2.23.2.22 spl_directory.c --- ext/spl/spl_directory.c 18 Jun 2008 10:05:29 - 1.45.2.27.2.23.2.22 +++ ext/spl/spl_directory.c 18 Jun 2008 17:16:39 - @@ -185,6 +185,9 @@ intern-file_name_len = spprintf(intern-file_name, 0, %s%c%s, spl_filesystem_object_get_path(intern, NULL TSRMLS_CC), DEFAULT_SLASH, intern-u.dir.entry.d_name); +#ifdef PHP_WIN32 + spl_unixify_path_separators(intern-file_name, intern-file_name_len); +#endif break; } } @@ -1196,6 +1199,9 @@ subdir-u.dir.sub_path_len = strlen(intern-u.dir.entry.d_name); subdir-u.dir.sub_path = estrndup(intern-u.dir.entry.d_name, subdir-u.dir.sub_path_len); } +#ifdef PHP_WIN32 + spl_unixify_path_separators(intern-u.dir.sub_path, intern-u.dir.sub_path_len); +#endif subdir-info_class = intern-info_class; subdir-file_class = intern-file_class; subdir-oth = intern-oth; @@ -1227,6 +1233,9 @@ if (intern-u.dir.sub_path) { len = spprintf(sub_name, 0, %s%c%s, intern-u.dir.sub_path, DEFAULT_SLASH, intern-u.dir.entry.d_name); +#ifdef PHP_WIN32 + spl_unixify_path_separators(sub_name, len); +#endif RETURN_STRINGL(sub_name, len, 0); } else { RETURN_STRING(intern-u.dir.entry.d_name, 1); Index: ext/spl/spl_directory.h === RCS file: /repository/php-src/ext/spl/spl_directory.h,v retrieving revision 1.12.2.5.2.4.2.10 diff -u -r1.12.2.5.2.4.2.10 spl_directory.h --- ext/spl/spl_directory.h 20 May 2008 21:46:50 - 1.12.2.5.2.4.2.10 +++ ext/spl/spl_directory.h 18 Jun 2008 17:10:18 - @@ -112,6 +112,20 @@ return (spl_filesystem_object*)((char*)it - XtOffsetOf(spl_filesystem_object, it)); } +#ifdef PHP_WIN32 +static inline void spl_unixify_path_separators(char *path, int path_len) +{ + char *s; + + /* unixify win paths */ + for (s = path; s - path path_len; ++s) { + if (*s == '\\') { + *s = '/'; + } + } +} +#endif + #define SPL_FILE_OBJECT_DROP_NEW_LINE 0x0001 /* drop new lines */ #define SPL_FILE_OBJECT_READ_AHEAD 0x0002 /* read on rewind/next */ #define SPL_FILE_OBJECT_SKIP_EMPTY 0x0006 /* skip empty lines */ Best regards, Marcus -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Selectable error messages
Hi Marcus, On Thu, Jun 19, 2008 at 8:57 PM, Marcus Boerger [EMAIL PROTECTED] wrote: Hello Lester, Wednesday, June 18, 2008, 9:14:52 AM, you wrote: OK - I've got PHP5.3.0-dev up at the moment in order to test the Firebird stuff, so display_errors is on. I need it on anyway while testing code. The 'problem' I am having is that of cause none of the other PHP stuff I'm using is currently not compatible with PHP5.3 so generates a lot of deprecated warnings in particular. Current one is phpDocumentor which uses is_a() extensively, and has a function to replicate it for backwards compatibility. Hey guys, I thought we undeprecated is_a()? there is no need whatsoever to deprecate it. We did, I would appreciate if you can nicely remove the E_DEPRECATED from it :) Cheers, -- Pierre http://blog.thepimp.net | http://www.libgd.org -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] unix path separators in spl
Hi Marcus, how about having this as an option inside the SPL classes that gets turned on by Phar automatically? Inside SPL we could have it as a user set-only flag. You are brilliant. I owe you a beer :) - Steph -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] unix path separators in spl
Hi Stas, Doesn't PATH_SEPARATOR use DEFAULT_SLASH? Should be DIRECTORY_SEPARATOR Bleh, must be nearly switching-off time and it's \ on windows (PATH_SEPARATOR is ; ). Do you propose to change it to /? dirsep_str[0] = DEFAULT_SLASH; dirsep_str[1] = '\0'; REGISTER_STRING_CONSTANT(DIRECTORY_SEPARATOR, dirsep_str, CONST_CS|CONST_PERSISTENT); Path comparison is important. I thought so too until I couldn't find any broken tests. With all due respect to phpt, these are very primitive code samples testing very narrow functional areas. They do not come anywhere near the stuff people do in real-life apps, combining different functions and extensions. Fair point. I like Marcus' idea tho'. - Steph -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] unix path separators in spl
Hi! Fair point. I like Marcus' idea tho'. As long as the default stays the same and doesn't hurt anybody not touching the option - go for it. -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Algorithm Optimizations - string search
Hi, I am also sorry for delay - got ill recently and spend a day in bed after night at emergency. I am working on other things now, and hope to post some patches soon. I will create patch for zend_memnstr as you suggest and post it here probably tomorrow. I have some ideas/ implementations/data already prepared for other functions (not only string related) but haven't got time to publish it neither here, nor on the page (http://212.85.117.53/gsoc/), but will try to do it till Monday. Michal On 2008-06-17, at 23:57, Nuno Lopes wrote: Hi, Sorry for taking so long to answer, but I'm trying to catch up last stuff. It's known that usually to optimize things for longer inputs you usually end up making things for short inputs worst. So IMHO, I think you should have the len==1 optimization and then use the KMP algorithm. Your implementation can be further optimized (at least on 32 bits machines), but seems ok for now. I suggest you to produce a final patch, send it here, and then move on to optimize other things (like strtr() that I'm sure wikipedia guys will appreciate). Nuno - Original Message - Hello again I have setup small page where I am publishing all the profiling and evaluation results. It is here: http://83.168.205.202/~michal/ standard15/ So far I have put there function usage profile, zend_memnstr analysis, stripos and strrpos analysis including some charts etc. CVS diffs where applicable are also posted along with comparison of original and patched code. Michal On 2008-06-11, at 09:47, Stanislav Malyshev wrote: Hi! Here are some statistics: - average haystack length: 624.2 - average needle length: 1.9 ! - 63% of needles of length 1 - avg length of haystacks shorter than avg: 41.0 - 85% of all haystacks - avg length of haystacks longer than avg: 5685.11 I think it would be interesting to see same excluding 1-char needles since in this case it should do one-char lookup (btw, if we don't do it on C level, it might be a good idea to). Although strpos implements fix for that, some other functions don't. My idea is than to implement ZEND_MEMNSTR once again in shape: if (needle_len = 1) here just linear sweep else if haystack_len 5000 (5000 is arbitrary - maybe some more tests needed to choose good value) original implementation (as it is the best one in this case) else BM/KMP (i think BM will be better in this case, as some people suggested) I'm not sure very big haystacks really worth the trouble - how many of them are used? It may be interesting to see medians instead of averages for that. But len=1 I think worth having special case. -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED]
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
Yes, I would rather put it in 5.4 (or whatever the next version) is and make sure that along with lambdas/closures we have a way of referring to functions/methods as first-class objects. -Andrei Marcus Boerger wrote: Hello Stanislav, nicely put but not in agreement with the PHP world. First we cannot add a new feature like this in a mini release as it comes with an API change. And second PHP is not anywhere close so we'd have to do it in a PHP 5.4 and personally I would like to avoid it. marcus Tuesday, June 17, 2008, 9:19:56 PM, you wrote: Hi! Johannes, what's your take on this one for 5.3? I'm not Johannes and I didn't review the proposal in detail yet, but I think we have enough for 5.3 right now. I'd think we better concentrate on tying the loose ends and rolling beta out and then moving towards the release than adding more and more features and never releasing it. 5.3 is not the final release until the end of times, there will be 5.4 etc. and 6, so there will be ample opportunity to add stuff. And 5.3 has enough stuff to be released, there's no rush to add more new things, especially radically new ones. My opinion is that we better take some time with it and not tie it to 5.3. -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED] Best regards, Marcus -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] cleaning up the functions - any volunteers?
Hi! While we nearing the release of 5.3 (hopefully?), there are many functions in the PHP code which still use old parameter parsing API (zend_get_parameters_ex) instead of the new one (zend_parse_parameters). I have cleaned up Zend engine functions, converting them to the new API, but there are about 1000 instances throughout PHP code (especially ext/standard) which still use the old way. This way is less correct, inconsistent with the new code, gives worse error messages, more prone to various bugs, etc. All new extensions and functions use the new way, and the only reason for keeping the old way in the code seems to be that nobody cleaned it up. Somebody has to bring the old ones into sync, and I don't think I personally will have time to do it in near timeframe. So if anybody could step up to that - by doing at least part of the work - that'd be great. The work is pretty simple, taking something like: zval **data; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, data) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(data); and move it into: char *str; int str_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, s, str, str_len) == FAILURE) { return; } and of course convert use of data zval into use of str. This needs to be done carefully as not to break things on some more tricky functions which may get arguments of multiple types, etc. Also, some tests which check error messages may need to be fixed since new API gives more detailed messages. zend_parse_parameters documented here: http://www.php.net/manual/en/internals2.ze1.zendapi.php though some of the newer parameters aren't (C, h, f, Z) so one may need to look at the code at zend_API.c. P.S. if some genius would invent a script to automate that - it'd be awesome, but I don't have very high hopes on that. :) -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] cleaning up the functions - any volunteers?
Hello Em Qui, 2008-06-19 às 16:06 -0700, Stanislav Malyshev escreveu: Hi! While we nearing the release of 5.3 (hopefully?), there are many functions in the PHP code which still use old parameter parsing API (zend_get_parameters_ex) instead of the new one (zend_parse_parameters). Yeah, I have noticed... That's also in my TODO. -- Regards, Felipe Pena. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
Hi Dmitry, First of all: Your patch does really simplify things internally quite a bit - I like it. I have a few issues though: The patch shouldn't affect opcode caches and other extensions as it doesn't change any structures. I don't see a problem in changing structures for either extensions nor opcode caches - as long as only entries are added. Binary compability with PHP 5.2 is not provided anyway (by neither 5.3 nor 6) and source compability is not affected if the old members are not touched or their semantics change. It uses the op_array-static_variables for lexical variables. That's a point I don't like. Although you use IS_CONSTANT to cleverly mask lexical variables, I really think a separate hash table would be a far better idea, especially for code maintainability. The patch also fixes several small issues and adds some missing functionality which didn't allow preg_replace_callback() (and may be others) to work with lambda functions. Oh yes, I somehow missed that, thanks! Please review. I (personally) have some smaller issues with the patch and one big issue: Smaller issues: * A separate hash table for the lexical variables would be much cleaner in my eyes. * The segfault that occurs with my patch still occurs with yours (see below for an example) But the one big issue is the syntax: ($foo | $bar) is just extremely painful in my eyes. I wouldn't want to use it - and it would be quite confusing (which side are the normal parameters, which side are the lexical vars?). I do see your point that the 'lexical' keyword inside the function body to actually have an effect on the function semantics is not optimal and that the list of lexical variables is probably better placed in the function definition. I therefore propose the following syntax: function (parameters) { } // no closure, simply lambda function (parameters) KEYWORD (lexical) { } // closure with lexical vars KEYWORD could be for example 'use'. That probably describes best what the function does: Use/import those variables from the current scope. Example: return function ($x) use ($s) { static $n = 0; $n++; $s = $n.':'.$s; $this-foo($x[0].':'.$s); }; As for simply omitting the keyword, e.g. function () () - as already suggested: I don't like that syntax either. Although I'm not a fan of too much language verbosity (that's why I don't like Fortran, Basic and Pascal), I think in this case, a little more verbosity wouldn't hurt - and typing 'use' is just 3 additional characters. Now for the examples for the smaller issues: Segfault: ?php $a = function () { $GLOBALS['a'] = NULL; echo destroyed closure\n; }; var_dump ($a); $a (); ? This crashes - due to the fact that the currently used op_array is destroyed upon destruction of the variable. This could get even more interesting if the closure called itself recursively. My proposal is to create a copy (but not a reference, just do a normal copy, for resources or objects that will just do the trick) of the variable internally in zend_call_function and zend_do_fcall_common_helper into a dummy zval and destroy that zval after the function call ended. That way, the GC won't kick in until after the execution of the closure. In zend_call_function that's easy - in zend_do_fcall_common helper we have the problem that the variable containing the closure is no longer available. An idea could be that the INIT_FCALL functions always additionally push the lambda zval to the argument stack (inside the function it will be ignored) and the fcall_common_helper will remove that zval from the stack prior to returning (and free it). If a non-closure is called, NULL (or an empty zval or whatever) could be pushed to the stack instead. Hmm, perhap's I'll have a better idea tomorrow. Anyway, since Andi suggested to use objects instead of resources, I'd like to use your patch as a starting point, if there are no objections. Regards, Christian -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
First, a comment from haskell-land: http://www.haskell.org/pipermail/haskell-cafe/2008-June/044533.html http://www.haskell.org/pipermail/haskell-cafe/2008-June/thread.html#44379 On Wednesday 18 June 2008, Christian Seiler wrote: Frankly, I don't really see a problem with using references. It fits into what's already there in PHP and it assures that closures have the necessary properties to make them useful. References are necessary, but an easy way to obtain copies of variables from the lexical context would be really nice. I have been introduced to functional programming through Haskell, where values are immutable, so a reference is basically the same as a copy. I like this behaviour because it makes closures distinctly non-dangerous by default. Getting the same behaviour out of PHP should not be as difficult as this: for ($i = 0; $i 10; $i++) { $loopIndex = $i; $arr[$i] = function () { lexical $loopIndex; return $loopIndex; }; unset ($loopIndex); } This is not only quite a hassle (making beer much cheaper than water, so to speak), I also believe it to be error-prone. A lot of programmers are going to forget that unset(). I would prefer something like this: for ($i = 0; $i 10; $i++) { $arr[$i] = function () { lexical_copy $i; return $i; }; } An alternative would be to let lexical behavie like function parameters: - copies by default lexical $x; - objects referenced by default lexical $obj; - other references optional lexical $y; Of course this would make lexical behave quite differently from global in this regard, decreasing consistency, but f*ck global, nobody should use that anyway. Better to have nice lexical closures. Gesundheit Wag -- Be careful about reading health books. You may die of a misprint. - Mark Twain -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
Hi! First, a comment from haskell-land: http://www.haskell.org/pipermail/haskell-cafe/2008-June/044533.html http://www.haskell.org/pipermail/haskell-cafe/2008-June/thread.html#44379 Thanks for the links, very interesting. Even a couple of comments in the thread going beyond PHP sucks and really discussing the matter. :) Best account is this: * A closure must only keep alive the varables it references, not the whole pad on which they are allocated [Check] * A closure must be able to call itself recursively (via a higher-order function typically) [Check, since you can use variable you assigned closure to inside the closure, if I understand correctly] * Multiple references to the same body of code with different bindings must be able to exist at the same time [Check] * Closures must be nestable. [Dunno - does the patch allow nesting and foo(1)(2)?] Getting the same behaviour out of PHP should not be as difficult as this: Well, I don't see any other way if you use references. Variables _are_ mutable in PHP. You could, of course, use copies, but then you'd lose ability to update. Maybe if we drop lexical and use Dmitry's proposal of $arr[$i] = function () ($i) { return $i; }; where ($i) would be copy, ($i) would be by-ref, then it'd be easier to control it. I know function()() is weird, but not everybody likes lexical either :) Maybe we can do lexical $y, but that looks weird too... Of course this would make lexical behave quite differently from global in this I wouldn't spend too much thought on making lexical work like global. global is for different purpose (and with $GLOBALS is obsolete anyway :) -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] cleaning up the functions - any volunteers?
While we nearing the release of 5.3 (hopefully?), there are many functions in the PHP code which still use old parameter parsing API (zend_get_parameters_ex) instead of the new one (zend_parse_parameters). Yeah, I have noticed... That's also in my TODO. Where is the Felipe fan club signup sheet? Regards, Philip -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
On Friday 20 June 2008, Stanislav Malyshev wrote: * A closure must be able to call itself recursively (via a higher-order function typically) [Check, since you can use variable you assigned closure to inside the closure, if I understand correctly] This is a matter of implementation rather than design, so it should be resolved by testing rather than by reading the spec ;-) Well, I don't see any other way if you use references. Variables _are_ mutable in PHP. They are also copied by default (passed by value). So if lexical used copies by default (and passed objects by reference), it would be consistent with all of php except for global. Let global be the outcast and be consistent with exerything else. As long as references are easily available, I think this is the much better trade-off. And it makes water slightly cheaper than beer. I know function()() is weird And would become weirder if foo(1)(2) is implemented. +1 to that by the way, allowing dereferencing for methods ( $obj-method1()-method2(); ) but not for functions is kinda mean. Maybe function( ) [ ] { } instead of function( ) ( ) { } That way the different parts actually look different. Also, confusion with arrays should be pretty much impossible here, both for the parser and human readers. I prefer lexical, though. Functional programming is not the default paradigm in PHP, so rather err on the side of explicitness. Gesundheit Wag -- Remember, growing older is mandatory. Growing up is optional. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP
Hi! Yes, I would rather put it in 5.4 (or whatever the next version) is and make sure that along with lambdas/closures we have a way of referring to functions/methods as first-class objects. Maybe we could make some object handler so that $object($foo) would work and treat object as functional object called on $foo and then have both reflection and closure object implement it? -- Stanislav Malyshev, Zend Software Architect [EMAIL PROTECTED] http://www.zend.com/ (408)253-8829 MSN: [EMAIL PROTECTED] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php