aboutsummaryrefslogtreecommitdiffstats
path: root/lib/scheme/base/20-let.csc
blob: 4a02dfa15897917dc69c5d88baa87e4375d09624 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
(export
  begin
  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 ...))))))