diff options
author | bd <bdunahu@operationnull.com> | 2024-08-01 22:37:18 -0600 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2024-08-01 22:37:18 -0600 |
commit | 64fcac482de0ba1a401cfc42066196a38661405e (patch) | |
tree | c8760685a6f28b12dedd08c00abc44ea7b731b26 /closure | |
parent | 7cbaa3cfc3691147c28614783c3fc3ebfdc0b042 (diff) |
Closure, coin sums, & number spiral generator
Diffstat (limited to 'closure')
-rw-r--r-- | closure/closure-test.scm | 59 | ||||
-rw-r--r-- | closure/closure.scm | 32 |
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)))) |