(define primes
  ;;; check for composite numbers by testing the
  ;;; most probable divisors first
  (let* ((start (list 2))
         (end start))
    (letrec
	((composite?
	  (lambda (v l)
	    (let ((d (car l)))
	      (if (> (* d d) v) #f
		  (if (zero? (remainder v d)) #t
		      (composite? v (cdr l)))))))
	 (findnext
	  (lambda (v)
	    (if (composite? v start)
		(findnext (+ v 1)) v))))
      (lambda ()
	(let* ((current (car end))
	       (next (findnext (+ current 1)))
	       (p (cons next '())))
	  (set-cdr! end p)
	  (set! end p)
	  current)))))

(define displayprimes
  (lambda (n)
    (if (not (zero? n))
	(begin
	  (display (primes)) (newline)
	  (displayprimes (- n 1))))))

(displayprimes 14)
