(define-syntax lazy-cons
  (syntax-rules ()
    ((_ head tail) (cons (delay head) (delay tail)))))

(define (lazy-head ll)
  (force (car ll)))

(define (lazy-tail ll)
  (force (cdr ll)))

(define-syntax lazy-list
  (syntax-rules ()
    ((_ x)      (lazy-cons x '()))
    ((_ x . xs) (lazy-cons x (lazy-list . xs)))))

;;; ----------------------------------------------------------------

(define (lazy-take n xs)
  (cond ((<= n 0)
         '())
        ((null? xs)
         '())
        (else
         (lazy-cons (lazy-head xs) (lazy-take (- n 1) (lazy-tail xs))))))

(define (lazy-zip f xs ys)
  (cond ((null? xs) '())
        ((null? ys) '())
        (else (lazy-cons (f (lazy-head xs) (lazy-head ys))
                         (lazy-zip f (lazy-tail xs) (lazy-tail ys))))))

(define (force-list xs)
  (if (null? xs)
      '()
      (cons (lazy-head xs) (force-list (lazy-tail xs)))))

;;; ----------------------------------------------------------------

(define fibs (lazy-cons 0 (lazy-cons 1 (lazy-zip + fibs (lazy-tail fibs)))))

(print (force-list (lazy-take 10 fibs)))