aboutsummaryrefslogtreecommitdiffstats
path: root/lib/scheme/base/20-let.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-08-03 20:25:46 -0700
committerRose Hogenson <rhogenson@posteo.net>2022-08-03 20:25:46 -0700
commit7e3e4eb8b4b8711635aa6e05d90877bfdfcb4b6d (patch)
treeb4395a22f7e9da161c5a3b06f3154387607973fe /lib/scheme/base/20-let.csc
parent25750ee505bd976d3c606200fec7253ad40c46d9 (diff)
downloadchromatopelma-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.csc76
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 ...))))))