Scheme修行 19章宝石泥棒

(define atom?
    (lambda (x)
        (and (not (pair? x)) (not (null? x)))))

(define fill)
(define leave)

(define waddle
    (lambda (l)
        (cond
            [(null? l) '()]
            [(atom? (car l)) (let ()
                                 (call-with-current-continuation
                                     (lambda (rest)
                                         (set! fill rest)
                                         (leave (car l))))
                                 (waddle (cdr l)))]
            [else (let ()
                      (waddle (car l))
                      (waddle (cdr l)))])))

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

(define get-next
    (lambda (x)
        (call-with-current-continuation
            (lambda (here-again)
                (set! leave here-again)
                (fill 'go)))))