Эта форма:
(+ a b)
Является комбинацией с 3 переменными. +
, a
и b
являются переменными, и Scheme оценивает их в любом порядке перед применением, которое принимает объект процедуры и значения.
Очень важно знать, что аргументы в пользовательской процедуре становятся переменными. они могут содержать любое значение , поэтому func
и next
являются просто именами. В коде вы видите, что они применяются, например. они заключаются в круглые скобки в позиции оператора, это единственный намек на то, что они должны быть процедурами. То есть помимо документации в комментариях: -)
Процедура в других местах, кроме позиции оператора, это просто передаваемое значение. Например. в (sum func (next a) next b)
очевидно next
- это процедура, которая используется для получения второго аргумента и которая передается как значение. Он будет связан с next
на следующей итерации, так что его тоже можно будет использовать там. Вы можете избежать этого, используя замыкания:
;;; sums the numbers a ... b
;;; using procedure func as key and
;;; procedure next to compute next value
;;; example:
;;; (sum (λ (v) (* v 2)) ; func
;;; 1 ; a
;;; (λ (v) (+ v 2)) ; next
;;; 10) ; b
;;; => 50
;;; = (+ 2 6 10 14 18)
(define (sum func a next b)
(define (helper a)
(if (> a b)
0
(+ (func a)
(helper (next a)))))
(helper a))
Более понятный способ, чем приведенный выше, - использовать имя let
, и вы также можете ввести аккумулятор, который делает этот хвост рекурсивным, но я полагаю, что вы узнаете это в конечном итоге, просто следуя книге.