无法在PHP中实现SICP AVERAGE-DAMP

时间:2013-06-19 23:40:02

标签: php lambda sicp

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

如何解决?

1 个答案:

答案 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的差异)