diff options
| author | 2024-12-26 12:35:51 -0500 | |
|---|---|---|
| committer | 2024-12-26 12:35:51 -0500 | |
| commit | 370de2b95743b91b3d15fe0d93d84e06f1864ee4 (patch) | |
| tree | 2ba1940baa7a6580c61ee224bda45036dfec3836 /mcgoron.cond-thunk.scm | |
cond-thunk
Diffstat (limited to 'mcgoron.cond-thunk.scm')
| -rw-r--r-- | mcgoron.cond-thunk.scm | 59 |
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 ...))))) + |
