схема — процедуры как аргументы в переполнении стека

Я изучаю sicp 1.3 (Формулирование абстракций с процедурами высшего порядка). Код схемы может вычислять сумму кубов целых чисел от 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
,

Это нормально, и есть ли лучший способ добиться этого?

0

Решение

Ваша реализация немного неполна.

'cube'($x) допустимый PHP, но не очень хороший способ вызвать функцию в PHP. (Это также очень страшно, что это даже работает.)

Используя call_user_func, Вы можете успешно применить любой подлежащий выкупу

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);
}
0

Другие решения

Из того, что я вижу здесь, оператор return вызывает функции cube и inc, но они требуют входных параметров. Если вы не называете их здесь (что, я думаю, имеет место), то вы должны передавать форварды, но с $ перед их именами.

РЕДАКТИРОВАТЬ: Имейте в виду, что для этого требуется PHP 5.3.0 или выше. Увидеть руководство для получения дополнительной информации.

0

Я решил это, просто заключил имя функции в кавычки.

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