diff options
| author | 2024-12-26 18:04:58 -0500 | |
|---|---|---|
| committer | 2024-12-26 18:04:58 -0500 | |
| commit | bfefae4c3ffbfe229e0cf68f6317909fe16b50a5 (patch) | |
| tree | d347f0dcecf9259c4f6cb03fc1e7a9bd5db0df60 /test | |
| parent | cond-thunk (diff) | |
values lib
Diffstat (limited to 'test')
| -rw-r--r-- | test/cas.scm | 66 |
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)))) + |
