diff options
| author | 2025-01-25 15:37:19 -0500 | |
|---|---|---|
| committer | 2025-01-25 15:37:19 -0500 | |
| commit | b0e41b9af1f9ce89fe6ef90686abd1dac6b86c10 (patch) | |
| tree | a162e0445b007d9e9fdc117a702cfd58e136cd27 /mcgoron | |
block structure
Diffstat (limited to 'mcgoron')
| -rw-r--r-- | mcgoron/srfi/61.sld | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/mcgoron/srfi/61.sld b/mcgoron/srfi/61.sld new file mode 100644 index 0000000..0fb32b0 --- /dev/null +++ b/mcgoron/srfi/61.sld @@ -0,0 +1,66 @@ +#| Copyright (C) 2004 Taylor Campbell. All rights reserved. + | + | Permission is hereby granted, free of charge, to any person + | obtaining a copy of this software and associated documentation + | files (the "Software"), to deal in the Software without + | restriction, including without limitation the rights to use, copy, + | modify, merge, publish, distribute, sublicense, and/or sell copies + | of the Software, and to permit persons to whom the Software is + | furnished to do so, subject to the following conditions: + | + | The above copyright notice and this permission notice shall be + | included in all copies or substantial portions of the Software. + | + | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + | BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + | ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + | SOFTWARE. + |# + + +(define-library (mcgoron srfi 61) + (import (scheme base)) + (export cond first-arg) + (begin + (define (first-arg x . rest) x)) + (begin + (define-syntax cond/maybe-more + (syntax-rules () + ((cond/maybe-more test consequent) + (if test + consequent)) + ((cond/maybe-more test consequent clause ...) + (if test + consequent + (cond clause ...))))) + (define-syntax cond + (syntax-rules (=> else) + ((cond (else else1 else2 ...)) + ;; The (IF #T (BEGIN ...)) wrapper ensures that there may be no + ;; internal definitions in the body of the clause. R5RS mandates + ;; this in text (by referring to each subform of the clauses as + ;; <expression>) but not in its reference implementation of COND, + ;; which just expands to (BEGIN ...) with no (IF #T ...) wrapper. + (if #t (begin else1 else2 ...))) + ((cond (test => receiver) more-clause ...) + (let ((T test)) + (cond/maybe-more T + (receiver T) + more-clause ...))) + ((cond (generator guard => receiver) more-clause ...) + (call-with-values (lambda () generator) + (lambda T + (cond/maybe-more (apply guard T) + (apply receiver T) + more-clause ...)))) + ((cond (test) more-clause ...) + (let ((T test)) + (cond/maybe-more T T more-clause ...))) + ((cond (test body1 body2 ...) more-clause ...) + (cond/maybe-more test + (begin body1 body2 ...) + more-clause ...))))))
\ No newline at end of file |
