php 中作为参数的过程

Procedures as Arguments in php

我正在学习sicp 1.3(Formulating Abstractions with Higher-Order Procedures)。方案代码可以计算从a到b的整数的立方和。

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))
(define (inc n) (+ n 1))
(define (cube x) (* x x x))
(define (sum-cubes a b)
  (sum cube a inc b))

我想通过 php 完成,这是代码。

function sum($term,$a,$next,$b){
    if ($a>$b){
        return 0;
    }else{
        return $term($a) + sum($term,$next($a),$next,$b);
    }
}
function inc($n){
    return $n + 1;
}
function cube($x){
    return $x*$x*$x;
}
function sum_cubes($a,$b){
    return sum(cube,$a,inc,$b);   // line 15
}

有效,但我收到了

PHP Notice: Use of undefined constant cube - assumed 'cube' in Command line code on line 15 PHP Notice: Use of undefined constant inc - assumed 'inc' in Command line code on line 15.

可以吗,有什么更好的实现方法吗?

据我所见,return 语句调用了 cube 和 inc 函数,但它们需要输入参数。如果你不在这里打电话给他们(我认为是这种情况),那么你应该传递前锋,但在他们的名字前面加一个 $。

编辑:请记住,这需要 PHP 5.3.0 或更高版本。有关详细信息,请参阅 manual

我解决了,只是用引号将函数名括起来。

function sum_cubes($a,$b){
    return sum('cube',$a,'inc',$b);
}

您的实施有点不完整。

'cube'($x) 是有效的 PHP,但并不是真正调用 PHP 中的函数的好方法。 (这也真的很可怕,它甚至有效。)

通过使用call_user_func, you can successfully apply any callable

function sum($term, $a, $next, $b) {
  if ($a > $b)
    return 0;
  else
    return call_user_func($term, $a)
      + sum($term, call_user_func($next, $a), $b);
}