summaryrefslogtreecommitdiff
path: root/closure
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2024-08-01 22:37:18 -0600
committerbd <bdunahu@operationnull.com>2024-08-01 22:37:18 -0600
commit64fcac482de0ba1a401cfc42066196a38661405e (patch)
treec8760685a6f28b12dedd08c00abc44ea7b731b26 /closure
parent7cbaa3cfc3691147c28614783c3fc3ebfdc0b042 (diff)
Closure, coin sums, & number spiral generator
Diffstat (limited to 'closure')
-rw-r--r--closure/closure-test.scm59
-rw-r--r--closure/closure.scm32
2 files changed, 91 insertions, 0 deletions
diff --git a/closure/closure-test.scm b/closure/closure-test.scm
new file mode 100644
index 0000000..ae10b67
--- /dev/null
+++ b/closure/closure-test.scm
@@ -0,0 +1,59 @@
+;; -*- compile-command: "guile -L . closure-test.scm"; -*-
+(use-modules (srfi srfi-64)
+ (closure))
+
+(define iterative-add-generator-1
+ (iterative-add))
+
+(define iterative-add-generator-2
+ (iterative-add))
+
+(test-begin "harness")
+
+(test-equal "add 0 to 1"
+ 1
+ (iterative-add-generator-1 1))
+
+(test-equal "add 1 to 2"
+ 3
+ (iterative-add-generator-1 2))
+
+(test-equal "add 2 to 6"
+ 8
+ (iterative-add-generator-1 6))
+
+(test-equal "add 6 to 5"
+ 11
+ (iterative-add-generator-1 5))
+
+(test-equal "add 0 to 2"
+ 2
+ (iterative-add-generator-2 2))
+
+(test-equal "add 2 to 2"
+ 4
+ (iterative-add-generator-2 2))
+
+
+(set-store (string->list "abcdefghijklmnopqrstuvwxyz"))
+
+;;; never returns, but manual validation shows
+;;; the function works. Bug in testing library?
+;; (test-equal "peek-char first"
+;; #\a
+;; (peek-char))
+
+(test-equal "advance-char first"
+ #\a
+ (advance-char))
+
+(test-equal "advance-char second"
+ #\b
+ (advance-char))
+
+;; (test-equal "peek-char second"
+;; #\c
+;; (peek-char))
+
+
+(test-end "harness")
diff --git a/closure/closure.scm b/closure/closure.scm
new file mode 100644
index 0000000..9dec47e
--- /dev/null
+++ b/closure/closure.scm
@@ -0,0 +1,32 @@
+(define-module (closure)
+ #:export (iterative-add
+ set-store
+ peek-store
+ advance-char))
+
+(define (iterative-add)
+ "Given NUM, returns NUM plus the previous
+supplied NUM."
+ (let ((prev-num 0))
+ (lambda num
+ (let ((result
+ (+ (car num) prev-num)))
+ (set! prev-num (car num))
+ result))))
+
+(define set-store #f)
+(define peek-char #f)
+(define advance-char #f)
+
+(let ((store '()))
+ (set! set-store
+ (lambda (lst)
+ (set! store lst)))
+ (set! peek-char
+ (lambda ()
+ (car store)))
+ (set! advance-char
+ (lambda ()
+ (let ((ret (car store)))
+ (set! store (cdr store))
+ ret))))