2016-09-15 4 views
0

я определил следующую процедуру, используя ракетку и внутри IDE доктора Ракетки:SICP - Лямбда выход

(define (random a b c x) 
    (lambda (a b c x) 
    (+ (* a (* x x)) 
     (* b x) 
     c))) 

Как вы можете видеть, есть лямбда-выражение внутри него. Я попытался назвать:

(random 4 2 9 3) 

И я получил в качестве выхода:

#<procedure:...ercício-2.4.rkt:16:2> 

Я думал, что я хотел бы получить 51.

Почему это происходит? Почему интерпретатор возвращает процедуру, а не результат операции?

ответ

1
(define (proc-name args ...) body ...) 

Производит процедуру и привязывает ее к переменной proc-name. Является abbrivation для

(define proc-name 
    (lambda (args ...) 
    body ...)) 

Где в этом случае define связывает переменную со значением, и это значение случается процедура. Если вы хотите, чтобы изложить ваш random становится:

(define random 
    (lambda (a b c x) 
    (lambda (a b c x) 
     (+ (* a (* x x)) (* b x) c)))) 

Внешняя процедура, которая принимает аргументы a, b, c и x и процедура возвращает другую процедуру, которая также принимает аргументы a, b, c, и x эффективно затеняет исходные привязки, а затем делает некоторое выражение на них. Пример использование будет

((random #f #f #f #f) 4 2 9 3) 

Так как очевидно, ваша процедура предположит, не возвращать процедуру, вы должны либо использовать сокращенную форму вверху:

(define (random a b c x)  
    (+ (* a (* x x)) (* b x) c)) 

или эквивалентный нон сахар форму:

(define random 
    (lambda (a b c x)  
    (+ (* a (* x x)) (* b x) c))) 

Как правило, процедуры процедур процедуры, а также процедуры пропуска в качестве аргументов, используемых в процедурах. Схема не имеет понятия, является ли привязка переменной процедурой до того, как она будет называть ее круглыми скобками, так что ошибки новичков, как дополнительные скобки, придают странную ошибку «application: (+ ab) не процедура», если вы попробуете что-то вроде ((+ a b) 4)

Примером, где возвращение является процедура, может быть частичным применением:

; makes a procedure that adds initial 
(define (make-add initial) 
    (lambda (v) (+ initial v)) 

(define add-10 (make-add 10)) 
(define add-3 (make-add 3)) 

(add-3 2) ; ==> 5 
(add-10 2) ; ==> 12