From cf374d43617ae5dcebe6c22df872ebfb32908da3 Mon Sep 17 00:00:00 2001
From: mehbark <terezi@pyrope.net>
Date: Fri, 14 Mar 2025 10:44:03 -0400
Subject: [PATCH] init

---
 pi.scm |  7 +++++++
 pi.sls | 21 +++++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 pi.scm
 create mode 100644 pi.sls

diff --git a/pi.scm b/pi.scm
new file mode 100644
index 0000000..8e623ef
--- /dev/null
+++ b/pi.scm
@@ -0,0 +1,7 @@
+(import (pi))
+(spigot
+ (lambda (n)
+   (write n)
+   ;; feels nicer to flush after every digit (it gets real slow)
+   ;; chez let's us omit the output port but not r6rs sad
+   (flush-output-port (current-output-port))))
diff --git a/pi.sls b/pi.sls
new file mode 100644
index 0000000..7c84925
--- /dev/null
+++ b/pi.sls
@@ -0,0 +1,21 @@
+;; https://www.gavalas.dev/blog/spigot-algorithms-for-pi-in-python/
+(library (pi)
+  (export spigot)
+  (import (rnrs (6)))
+  (define (spigot yield)
+    (let loop ([q 1] [r 0] [t 1] [k 1] [n 3] [l 3])
+      (if (< (- (+ (* 4 q) r) t) (* n t))
+          (begin
+            (yield n)
+            (loop (* 10 q)
+                  (* 10 (- r (* n t)))
+                  t
+                  k
+                  (- (div (* 10 (+ (* 3 q) r)) t) (* 10 n))
+                  l))
+          (loop (* q k)
+                (* (+ (* 2 q) r) l)
+                (* t l)
+                (+ k 1)
+                (div (+ (* q (+ (* 7 k) 2)) (* r l)) (* t l))
+                (+ l 2))))))