;; Lazy evaluated lists. (require (lib "defmacro.ss" "mzlib")) (load "89.ss") (define-syntax lazy-cons (syntax-rules () ((_ x y) (cons x (lambda () y))))) (define lazy-car car) (define (lazy-cdr x) ((cdr x))) (define (infinity-starting-at start) (lazy-cons start (infinity-starting-at (+ start 1)))) (define natural-numbers (infinity-starting-at 1)) (define (list->lazy L) (if (null? L) L (lazy-cons (car L) (list->lazy (cdr L))))) (define (lazy->list L) (if (null? L) L (cons (lazy-car L) (lazy->list (lazy-cdr L))))) (define-opt (lazy-filter decide-fun lazy-list [how-many -1]) (if (or (null? lazy-list) (= how-many 0)) '() (let ((current (lazy-car lazy-list))) (if (decide-fun current) (lazy-cons current (lazy-filter decide-fun (lazy-cdr lazy-list) (- how-many 1))) (lazy-filter decide-fun (lazy-cdr lazy-list) how-many))))) (define (lazy-map fun lazy-list) (if (null? lazy-list) '() (lazy-cons (fun (lazy-car lazy-list)) (lazy-map fun (lazy-cdr lazy-list)))))