From 7e3e4eb8b4b8711635aa6e05d90877bfdfcb4b6d Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Wed, 3 Aug 2022 20:25:46 -0700 Subject: Start the scheme base library. --- lib/scheme/base.csc | 3 ++ lib/scheme/base/10-define.csc | 15 +++++++++ lib/scheme/base/20-let.csc | 76 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 lib/scheme/base.csc create mode 100644 lib/scheme/base/10-define.csc create mode 100644 lib/scheme/base/20-let.csc 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 ...)))))) -- cgit v1.3.1