(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