Пожалуйста, взгляните на функцию two-in-a-row*?
в главе 19.
Мой вопрос касается (leave '())
во вспомогательной функции get-first
. Обратите внимание, что (waddle l)
вернет либо '()
, либо атом, что указывает на исчерпание списка или получение атома из списка.
Без (leave '())
он все равно будет возвращать эти два типа значений, просто не будет использовать продолжение leave
. Но в книге написано, что без (leave '())
плохо, я просто не понимаю, почему.
(define two-in-a-row*
(letrec ([leave id] ; the identity function
[fill id]
[waddle (lambda (l)
(cond [(null? l) '()]
[(atom? (car l))
(begin
(letcc rest
(set! fill rest)
(leave (car l)))
(waddle (cdr l)))]
[else
(begin
(waddle (car l))
(waddle (cdr l)))]))]
[get-first (lambda (l)
(letcc here
(set! leave here)
(waddle l)
(leave '()) ; why is this part needed???
))]
[get-next (lambda (l)
(letcc here
(set! leave here)
(fill 'go)))]
[T? (lambda (a)
(let ([n (get-next 'dummy)])
(if (atom? n)
(or (eq? a n)
(T? n))
#f)))])
(lambda (l)
(let ([fst (get-first l)])
(if (atom? fst)
(T? fst)
#f)))))
Большое спасибо.
Еще одна интересная последовательность об этой проблеме.