1(define primes
2  ;;; check for composite numbers by testing the
3  ;;; most probable divisors first
4  (let* ((start (list 2))
5         (end start))
6    (letrec
7	((composite?
8	  (lambda (v l)
9	    (let ((d (car l)))
10	      (if (> (* d d) v) #f
11		  (if (zero? (remainder v d)) #t
12		      (composite? v (cdr l)))))))
13	 (findnext
14	  (lambda (v)
15	    (if (composite? v start)
16		(findnext (+ v 1)) v))))
17      (lambda ()
18	(let* ((current (car end))
19	       (next (findnext (+ current 1)))
20	       (p (cons next '())))
21	  (set-cdr! end p)
22	  (set! end p)
23	  current)))))
24
25(define displayprimes
26  (lambda (n)
27    (if (not (zero? n))
28	(begin
29	  (display (primes)) (newline)
30	  (displayprimes (- n 1))))))
31
32(displayprimes 14)
33