diff options
| author | Rose Hogenson <rhogenson@posteo.net> | 2022-08-03 20:25:46 -0700 |
|---|---|---|
| committer | Rose Hogenson <rhogenson@posteo.net> | 2022-08-03 20:25:46 -0700 |
| commit | 7e3e4eb8b4b8711635aa6e05d90877bfdfcb4b6d (patch) | |
| tree | b4395a22f7e9da161c5a3b06f3154387607973fe /lib/scheme/base/20-let.csc | |
| parent | 25750ee505bd976d3c606200fec7253ad40c46d9 (diff) | |
| download | chromatopelma-7e3e4eb8b4b8711635aa6e05d90877bfdfcb4b6d.tar.zst | |
Start the scheme base library.
Diffstat (limited to 'lib/scheme/base/20-let.csc')
| -rw-r--r-- | lib/scheme/base/20-let.csc | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/scheme/base/20-let.csc b/lib/scheme/base/20-let.csc new file mode 100644 index 0000000..96f0247 --- /dev/null +++ b/lib/scheme/base/20-let.csc @@ -0,0 +1,76 @@ +(export + lambda + let + let* + letrec + letrec*) +(import (only (csc builtins) + define-syntax + lambda)) +(begin + + + (define-syntax letrec* + (syntax-rules () + ((letrec* ((var1 init1) ...) body1 body2 ...) + (lambda () + (define var1 init1) + ... + body1 body2 ...)))) + + + (define-syntax letrec-generate-temp-names + (syntax-rules () + ((letrec-generate-temp-names + () + (temp1 ...) + ((var1 init1) ...) + body ...) + (letrec* ((temp1 init1) + ... + (var1 temp1) + ...) + body ...)) + ((letrec-generate-temp-names + (x y ...) + (temp ...) + ((var1 init1) ...) + body ...) + (letrec-generate-temp-names + (y ...) + (newtemp temp ...) + ((var1 init1) ...) + body ...)))) + + + (define-syntax letrec + (syntax-rules () + ((letrec ((var1 init1) ...) body1 body2 ...) + (letrec-generate-temp-names + (var1 ...) + () + ((var1 init1) ...) + body1 body2 ...)))) + + + (define-syntax let + (syntax-rules () + ((let ((name val) ...) body1 body2 ...) + ((lambda (name ...) body1 body2 ...) + val ...)) + ((let tag ((name val) ...) body1 body2 ...) + ((letrec ((tag (lambda (name ...) + body1 body2 ...))) + tag) + val ...)))) + + + (define-syntax let* + (syntax-rules () + ((let* () body1 body2 ...) + (let () body1 body2 ...)) + ((let* ((name1 val1) (name2 val2) ...) + body1 body2 ...) + (let ((name1 val1)) + (let* ((name2 val2) ...) + body1 body2 ...)))))) |
