ID: 40160
Updated by: [EMAIL PROTECTED]
Reported By: a dot steenveld at id dot umcn dot nl
-Status: Open
+Status: Bogus
Bug Type: Feature/Change Request
Operating System: MS windows XP pro
PHP Version: 4.4.4
New Comment:
We're not going to change this behavior. (Might break BC and other
reasons)
If you want to use a "guessed" name you can still use something like
$name = "\0lambda_1"; $name($param);
Previous Comments:
------------------------------------------------------------------------
[2007-01-18 13:34:45] a dot steenveld at id dot umcn dot nl
Description:
------------
create_function() results gets lost sometimes.
And yes, I've checked preveous bugreports, and yes, I know that the use
of create_function() is advised againt in the way I'm using it here. But
I wan't to use continuations in PHP.
The problem is akin to bug 10721 (which is not a bug).
The problem:
create_function() returns a string in the format '\0lambda_%d'
Subsequent calls with a result from create_function() as a argument
will result in an empy string.
The workaround is to remove (or replace) this 0.
Request to change the result from create_function().
Starting the name with a digit (or any character not in [_A-Za-z]) will
result in an illegal name, safe enough to prevent name clashes.
This suggest a format like '%d_lambda' as return result from
create_function().
Reproduce code:
---------------
<?php
/* cont.php - problem with continuations when using
create_function()
vim:nu
Code inspired by
http://www.ps.uni-sb.de/~duchier/python/continuations.html
*/
function writeln($s) { echo "$s\n"; }
function lambda ($args, $code) { return create_function ($args,
$code); }
function lambda0 ($args, $code) { return substr(create_function ($args,
$code), 1); }
function L ($l) { if (strncmp($l, 'lambda_', 7) === 0) return "\0$l";
else return $l; }
function mul ($x, $y, $c) { echo "mul($x, $y, $c)\n"; $f = L($c);
$f($x*$y); }
function add ($x, $y, $c) { echo "add($x, $y, $c)\n"; $f = L($c);
$f($x+$y); }
function mal ($x, $y, $c) { echo "mal($x, $y, $c)\n"; mul(2, $x,
lambda0 ('$v', "add(\$v, $y, $c);")); }
function ma ($x, $y, $c) { echo "ma($x, $y, $c)\n"; $f = L($c);
$f(2*$x+$y); }
function f_OK ($x, $y) { mal($x, $y, lambda0 ('$v', "writeln(\"f($x,
$y) = \$v\");")); }
function f_FAIL ($x, $y) { mal($x, $y, lambda ('$v', "writeln(\"f($x,
$y) = \$v\");")); }
f_OK (2, 2);
f_FAIL(2, 2); // the result of create_function() gets truncated to an
empty string!
?>
Expected result:
----------------
// f_FAIL)() not active
mal(2, 2, lambda_1)
mul(2, 2, lambda_2)
add(4, 2, lambda_1)
f(2, 2) = 6
Actual result:
--------------
// f_FAIL)() active
mal(2, 2, lambda_1)
mul(2, 2, lambda_2)
add(4, 2, lambda_1)
f(2, 2) = 6
mal(2, 2, \0lambda_3)
Parse error: parse error, unexpected '}' in ...\cont.php(11) :
runtime-created function on line 1
mul(2, 2, )
Fatal error: Call to undefined function: () in ...\cont.php on line
14
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=40160&edit=1