我正在观看SICP 2a讲座:
https://www.youtube.com/watch?v=erHp3r6PbJk&list=PL8FE88AA54363BC46
<>大约32:30 Gerald Jay Sussman介绍了AVERAGE-DAMP程序。它接受一个过程并返回一个过程,返回它的参数的平均值和应用于参数的第一个过程。在Scheme中它看起来像这样:(define average-damp
(lambda (f)
(lambda (x) (average (f x) x))))
我决定用PHP重写它:
function average_damp($f)
{
return function ($x)
{
$y = $f($x);//here comes the error - $f undefined
return ($x + $y) / 2;
};
}
然后尝试用一个简单的程序:
function div_by2($x)
{
return $x / 2;
}
$fun = average_damp("div_by2");
$fun(2);
这个东西应该返回2和(2/2)之间的平均值=(2 + 1)/ 2 = 3/2。
但是$ f在内部过程中未定义,给出错误:
PHP Notice: Undefined variable: f on line 81
PHP Fatal error: Function name must be a string on line 81
如何解决?
答案 0 :(得分:4)
你需要让返回的函数知道传递$f
- use
是这里的关键字
function average_damp($f)
{
return function ($x) use($f) {
$y = $f($x);
return ($x + $y) / 2;
};
}
Recommended video about closure and variable scope(主要是javascript,但也包括与PHP的差异)