(define (pi-spigot z)
  (let loop ((z z) (ds '()) (q 1) (r 0) (t 1) (k 1) (n 3) (m 3))
    (cond ((zero? z) (reverse ds))
          ((< (+ q q q q r (- t)) (* n t))
            (loop (- z 1) (cons n ds) (* 10 q) (* 10 (- r (* n t)))
                  t k (- (quotient (* 10 (+ q q q r)) t) (* 10 n)) m))
          (else (loop z ds (* q k) (* (+ q q r) m) (* t m) (+ k 1)
                      (quotient (+ (* q (+ k k k k k k k 2)) (* r m))
                      (* t m)) (+ m 2))))))

(display (pi-spigot 1001))
