Project Euler 25 in Scheme
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))