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/20-let.csc | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 lib/scheme/base/20-let.csc (limited to 'lib/scheme/base/20-let.csc') 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