;; Stream processing (module stream mzscheme ;; Lazy list ;; Wadler's recipe: ;; * wrap all constructors (e.g., '(), cons) with delay, ;; * apply force to arguments of deconstructors (e.g., car, cdr and null?), ;; * wrap procedure bodies with (delay (force ...)). ;; All names prefixed with '@' operate on lazy lists. (define-syntax @cons (syntax-rules () ((_ a b) (delay (cons a b))))) (define @nil (delay '())) (define (@car c) (car (force c))) (define (@cdr c) (cdr (force c))) (define (@null? c) (null? (force c))) ;; Universal list iteration. (define (@fold f v l) (if (@null? l) (delay v) (delay (f (@car l) (force (@fold f v (@cdr l))))))) ;; Matcher )