Project Euler 25 in Scheme

@timgallant

Implemented lazily evaluated fibonacci sequence

;; helpers

(define lazy-car car)

(define (lazy-cdr ls)
  (force (cdr ls)))

(define-syntax lazy-cons
  (syntax-rules ()
    ((_ a b) (cons a (delay b)))))

(define (lazy-map fn . lss)
  (if (memq '() lss)
      '()
      (lazy-cons (apply fn (map lazy-car lss))
                 (apply lazy-map fn (map lazy-cdr lss)))))

(define (lazy-ref ls n)
  (if (= n 0)
      (lazy-car ls)
      (lazy-ref (lazy-cdr ls) (- n 1))))

;; e25

(define fib
  (lazy-cons 1
             (lazy-cons 1
                        (lazy-map + fib (lazy-cdr fib)))))

(define (e25 n)
  (define (e25-inner x)
    (let ((y (lazy-ref fib x)))
      (if (>= (length (num->list y)) n)
          (+ x 1)
          (e25-inner (+ x 1)))))
  (e25-inner 1))