Схема для начинающих: процедуры, которые возвращаются сами

Это пример из книги, которую я читаю:

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 функция:

  1. Определение внутренней функции length-iter;
  2. Вызов внутренней функции 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,

Другие вопросы по тегам