aboutsummaryrefslogtreecommitdiffstats
path: root/mcgoron.cond-thunk.scm
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2024-12-26 12:35:51 -0500
committerGravatar Peter McGoron 2024-12-26 12:35:51 -0500
commit370de2b95743b91b3d15fe0d93d84e06f1864ee4 (patch)
tree2ba1940baa7a6580c61ee224bda45036dfec3836 /mcgoron.cond-thunk.scm
cond-thunk
Diffstat (limited to 'mcgoron.cond-thunk.scm')
-rw-r--r--mcgoron.cond-thunk.scm59
1 files changed, 59 insertions, 0 deletions
diff --git a/mcgoron.cond-thunk.scm b/mcgoron.cond-thunk.scm
new file mode 100644
index 0000000..ff7171e
--- /dev/null
+++ b/mcgoron.cond-thunk.scm
@@ -0,0 +1,59 @@
+#| 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.
+ |#
+
+(define-syntax cond-thunk
+ (syntax-rules (else)
+ ((cond-thunk (else body ...))
+ (begin body ...))
+ ((cond-thunk expr rest ...)
+ (let ((value expr))
+ (if value
+ (value)
+ (cond-thunk rest ...))))
+ ((cond-thunk) #f)))
+
+(define any-thunk
+ (letrec ((loop
+ (lambda (thunks else-thunk)
+ (if (null? thunks)
+ (else-thunk)
+ (let* ((thunk (car thunks))
+ (result (thunk)))
+ (if (not result)
+ (loop (cdr thunks))
+ (result)))))))
+ (case-lambda
+ ((thunks) (loop thunks (lambda () #f)))
+ ((thunks else-thunk) (loop thunks else-thunk)))))
+
+(define-syntax when-ct
+ (syntax-rules ()
+ ((when-ct conditional body ...)
+ (if conditional
+ (lambda () body ...)
+ #f))))
+
+(define-syntax lambda-ct
+ (syntax-rules ()
+ ((lambda-ct formal conditional body ...)
+ (lambda formal (when-ct conditional body ...)))))
+
+(define-syntax define-ct
+ (syntax-rules ()
+ ((define-ct (name . formal) conditional body ...)
+ (define name
+ (lambda-ct formal conditional body ...)))))
+