Схема для начинающих: процедуры, которые возвращаются сами
Это пример из книги, которую я читаю:
1 (define (length items)
2 (define (length-iter a count)
3 (if (null? a)
4 count
5 (length-iter (cdr a)(+ 1 count))))
6 (length-iter items 0))
То, что я не понимаю, как можно length-iter
знать о графе? Первый раз эта процедура вызывается с list
Это, в свою очередь, определит другую процедуру с двумя аргументами, я получаю столько. Но как он узнал, что a
это list items
? Это еще не достигло строки 6, где items
передается length-iter
в качестве аргумента a
, Каким-то образом, хотя он уже знает это и может сделать вычисление. Любая помощь в разъяснении этого немного приветствуется!
1 ответ
Есть две части в length
функция:
- Определение внутренней функции
length-iter
; - Вызов внутренней функции
length-iter
,
В вызове, т.е. строке 6, вы передаете оригинал items
список для внутренней функции в качестве аргумента. Это где внутренняя функция вызывается. Ранее вы просто определяли функцию, а не вызывали ее:
(length-iter items 0)
Таким образом, items
будет связан с a
, а также 0
в count
, Вы можете думать о внутренней функции как о отдельной функции:
(define (length-iter a count)
(if (null? a)
count
(length-iter (cdr a)(+ 1 count))))
А потом подумай о своем length
функционировать так, как будто он просто делегировал всю работу length-iter
функция:
(define (length items)
(length-iter items 0))
Вот что делается в твоей функции. Разница в том, что length-iter
функция известна только length
,