diff options
Diffstat (limited to 'lib/scheme')
| -rw-r--r-- | lib/scheme/base.csc | 3 | ||||
| -rw-r--r-- | lib/scheme/base/10-define.csc | 15 | ||||
| -rw-r--r-- | lib/scheme/base/20-let.csc | 76 |
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 ...)))))) |
