Функции get-first, get-next и waddle от Seasoned Schemer

(define get-first
  (lambda (l)
    (call-with-current-continuation
      (lambda (here)
        (set! leave here)
        (waddle l)
        (leave (quote ()))))))

(define get-first
  (lambda (l)
    (call-with-current-continuation
      (lambda (here)
        (set! leave here)
        (leave (waddle l))))))

Для тех, кто не знаком с книгой «Опытный интриган», get-first, get-nextи waddle(последние два здесь не определены). ) — это процедуры, по-видимому, моделирующие сопрограммыдля итерации по дереву, переданному в waddle, что дает только листья. Непосредственно перед выходом waddleпри предпоследнем повторном входе он устанавливает точку повторного входа туда, где он всегда будет возвращать только чистое значение '()т.е. вместо получения '()фактическое значение функции waddleравно'(), как если бы это была чистая функция all вместе.

Имея это в виду, мы можем увидеть, что устанавливает get-first... Когда waddleвозвращает «по-настоящему», это будет внутри call/ ccв get-firstи затем (leave (quote ()))значение get-first(и, в свою очередь, это leaveпредназначен для возврата к get-nextна последней итерации, поэтому именно get-nextвыполняет «фактический» возврат ' ()).

Так почему же вторая версия не эквивалентна, где waddleзначение '()будет аргументом для leave?

5
задан Will Ness 11 February 2018 в 09:57
поделиться