rendered paste body(defpackage lazy)
(in-package lazy)
(defun lazy-first (l)
(if
(eql (first l) :promise) (first (eval (rest l)))
(first l)))
(defun lazy-rest (l)
(if
(eql (first l) :promise) (rest (eval (rest l)))
(rest l)))
(defun lazy-nth (n l)
(if
(= n 0) (lazy-first l)
(lazy-nth (- n 1) (lazy-rest l))))
(defun integers-from (n)
`(,n :promise integers-from ,(1+ n)))
(defun fibonacci-from (n m)
`(,n ,m :promise fibonacci-from ,(+ n m) ,(+ n (* 2 m))))
(defun relatively-prime (n integers)
(cond
((null integers) t)
((= (mod n (first integers)) 0) nil)
(t (relatively-prime n (rest integers)))))
(defun primes-from (n others)
(if (relatively-prime n others)
`(,n :promise primes-from ,(1+ n) (quote ,(cons n others)))
(primes-from (1+ n) others)))