(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
?