1

我在看 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

怎么修?

4

1 回答 1

4

您需要让返回的函数知道已通过$f-use是这里的关键字

function average_damp($f)
{
      return function ($x) use($f) {
            $y = $f($x);
            return ($x + $y) / 2;
      };
}

关于闭包和变量作用域的推荐视频(主要是 javascript,但也包括与 PHP 的差异)

于 2013-06-19T23:42:16.363 回答