aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2024-12-26 18:04:58 -0500
committerGravatar Peter McGoron 2024-12-26 18:04:58 -0500
commitbfefae4c3ffbfe229e0cf68f6317909fe16b50a5 (patch)
treed347f0dcecf9259c4f6cb03fc1e7a9bd5db0df60 /test
parentcond-thunk (diff)
values lib
Diffstat (limited to 'test')
-rw-r--r--test/cas.scm66
1 files changed, 66 insertions, 0 deletions
diff --git a/test/cas.scm b/test/cas.scm
new file mode 100644
index 0000000..5d87632
--- /dev/null
+++ b/test/cas.scm
@@ -0,0 +1,66 @@
+#| Copyright 2024 Peter McGoron
+ |
+ | Licensed under the Apache License, Version 2.0 (the "License");
+ |
+ | you may not use this file except in compliance with the License.
+ | You may obtain a copy of the License at
+ |
+ | http://www.apache.org/licenses/LICENSE-2.0
+ |
+ | Unless required by applicable law or agreed to in writing, software
+ | distributed under the License is distributed on an "AS IS" BASIS,
+ | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ | See the License for the specific language governing permissions and
+ | limitations under the License.
+ |#
+
+(cond-expand
+ (chicken (import test r7rs))
+ (else (import (srfi 64))))
+
+(load "../mcgoron.cond-thunk.srfi.210.compat.sld")
+(load "../mcgoron.cond-thunk.sld")
+(load "../mcgoron.cond-thunk.values.sld")
+(import (mcgoron cond-thunk) (mcgoron cond-thunk values) (srfi 1))
+
+(define function=> pair=>)
+
+(define (mult=> form)
+ (cond-values
+ (after ((let (function=> form) => (head tail))
+ (when (eq? head '*)))
+ tail)))
+
+(define (add=> form)
+ (cond-values
+ (after ((let (function=> form) => (head tail))
+ (when (eq? head '+)))
+ tail)))
+
+(define (add? form)
+ (cond-thunk
+ (after ((let (add=> form) => (_)))
+ #t)
+ (else #f)))
+
+(define (distribute form)
+ (cond-thunk
+ (after ((let (mult=> form) => (arguments)))
+ (let-values (((add others) (partition add? arguments)))
+ ;; ADD is a list of addition clauses.
+ (let ((added-values (concatenate (map cdr add))))
+ (cons '+
+ (map (lambda (added-value)
+ (cons* '*
+ (distribute added-value)
+ others))
+ added-values)))))
+ (after ((let (function=> form) => (head arguments)))
+ (cons head (map distribute arguments)))
+ (else form)))
+
+(test
+ "distribute1"
+ '(+ (* y x) (* z x))
+ (distribute '(* x (+ y z))))
+