generated from dannypsnl-fork/racket-project
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlow-level-let.rkt
46 lines (41 loc) · 944 Bytes
/
low-level-let.rkt
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
#lang racket
(require nanopass)
(define (constant? c)
(or (integer? c)))
(define-language L0
(terminals
(constant (c))
(symbol (x)))
(Expr (e body)
(let ([x e] ...) body)
x
c))
(define-language L1
(extends L0)
(Expr (e)
(- (let ([x e] ...) body))
(+ (begin e* ... e)
(set! x e))))
(define-pass low-level-let : L0 (e) -> L1 ()
(Expr : Expr (e) -> Expr ()
[(let ([,x ,[e]] ...)
,body)
`(begin
(set! ,x ,e)
...
,body)]))
(define-pass explicit-control : L1 (e) -> L1 ()
(Expr : Expr (e) -> Expr ()
[(begin ,[e*] ... ,[e])
`(begin ,e* ... ,e)]
[(set! ,x (begin ,[e*] ... ,[e]))
`(begin ,e* ...
(set! ,x ,e))]))
(define passes
(compose
explicit-control
low-level-let))
(with-output-language (L0 Expr)
(passes
`(let ([x (let ([y 1]) y)])
x)))