aboutsummaryrefslogtreecommitdiffstats
path: root/lib/scheme
diff options
context:
space:
mode:
Diffstat (limited to 'lib/scheme')
-rw-r--r--lib/scheme/base.csc3
-rw-r--r--lib/scheme/base/10-define.csc15
-rw-r--r--lib/scheme/base/20-let.csc76
3 files changed, 94 insertions, 0 deletions
diff --git a/lib/scheme/base.csc b/lib/scheme/base.csc
new file mode 100644
index 0000000..c9b5c0c
--- /dev/null
+++ b/lib/scheme/base.csc
@@ -0,0 +1,3 @@
+(define-library (scheme base)
+ (include-library-declarations "base/10-define.csc")
+ (include-library-declarations "base/20-let.csc"))
diff --git a/lib/scheme/base/10-define.csc b/lib/scheme/base/10-define.csc
new file mode 100644
index 0000000..d110268
--- /dev/null
+++ b/lib/scheme/base/10-define.csc
@@ -0,0 +1,15 @@
+(export
+ define
+ define-syntax)
+(import (only (csc builtins)
+ builtin-define
+ define-syntax))
+(begin
+
+
+ (define-syntax define
+ (syntax-rules ()
+ ((define (f . args) body ...)
+ (define f (lambda args body ...)))
+ ((define name binding)
+ (builtin-define name binding)))))
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 ...))))))