В чем разница между (define (deriv-squared f ) (proc (deriv f))) и (define deriv-squared (proc deriv))?

Код в моей домашней работе работает без ошибок:

(define (deriv-squared f)
(square-a-procedure (deriv f)))

Но когда я определяю его, как показано ниже, он не оценивает и говорит: «вывод как неопределенный», даже если я определяю его. В чем разница между двумя определениями?

(define deriv-squared (square-a-procedure deriv))

person I.qwe    schedule 06.11.2016    source источник


Ответы (1)


Переменная должна иметь привязку до того, как на нее ссылаются (используют).

Если у вас есть

(define deriv-squared (square-a-procedure deriv))

затем оценивается (square-a-procedure deriv), и полученному значению присваивается имя deriv-squared. Во время оценки (square-a-procedure deriv) просматривается значение deriv. Следовательно: определение deriv должно быть помещено перед определением deriv-squared.

(Я предполагаю, что вы поместили определение deriv дальше в исходный файл.)

Теперь, почему ваше первое определение сработало?

(define (deriv-squared f) (square-a-procedure (deriv f)))

Это сокращение от:

(define deriv-squared 
   (lambda (f) 
      (square-a-procedure (deriv f))))

Здесь (lambda (f) (square-a-procedure (deriv f)))) оценивается как процедура. Но deriv не упоминается до тех пор, пока процедура не будет использована. Итак, если deriv определено до того, как вы используете deriv-squared, все работает нормально.

person soegaard    schedule 06.11.2016