(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)))