forked from racket/racket
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlambda.rkt
More file actions
58 lines (54 loc) · 1.87 KB
/
lambda.rkt
File metadata and controls
58 lines (54 loc) · 1.87 KB
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
#lang racket/base
(require "match.rkt"
"vehicle.rkt"
"id.rkt")
;; See also "vehicle.rkt" for the `lam` structure type.
(provide extract-lambdas!)
(define (extract-lambdas! lambdas e)
(match e
[`(define ,id ,rhs)
(extract-lambdas! lambdas rhs)]
[`(define-values ,_ ,rhs)
(extract-lambdas! lambdas rhs)]
[`(begin ,es ...)
(for ([e (in-list es)])
(extract-lambdas! lambdas e))]
[`(begin0 ,es ...)
(extract-lambdas! lambdas `(begin . ,es))]
[`(lambda ,ids . ,body)
(hash-set! lambdas e (make-lam (genid 'c_lambda) e))
(extract-lambdas! lambdas `(begin . ,body))]
[`(case-lambda [,idss . ,bodys] ...)
(hash-set! lambdas e (make-lam (genid 'c_case_lambda) e))
(for ([ids (in-list idss)]
[body (in-list bodys)])
(extract-lambdas! lambdas `(begin . ,body)))]
[`(quote ,_) lambdas]
[`(if ,tst ,thn ,els)
(extract-lambdas! lambdas tst)
(extract-lambdas! lambdas thn)
(extract-lambdas! lambdas els)]
[`(with-continuation-mark ,key ,val ,body)
(extract-lambdas! lambdas key)
(extract-lambdas! lambdas val)
(extract-lambdas! lambdas body)]
[`(let . ,_)
(extract-let-lambdas! lambdas e)]
[`(letrec . ,_)
(extract-let-lambdas! lambdas e)]
[`(letrec* . ,_)
(extract-let-lambdas! lambdas e)]
[`(set! ,id ,rhs)
(extract-lambdas! lambdas rhs)]
[`(call-with-values (lambda () . ,body1) (lambda (,ids ...) . ,body2))
(extract-lambdas! lambdas `(begin . ,body1))
(extract-lambdas! lambdas `(begin . ,body2))]
[`(,rator ,rands ...)
(extract-lambdas! lambdas `(begin ,rator . ,rands))]
[`,_ (void)]))
(define (extract-let-lambdas! lambdas e)
(match e
[`(,let-id ([,ids ,rhss] ...) . ,body)
(for ([rhs (in-list rhss)])
(extract-lambdas! lambdas rhs))
(extract-lambdas! lambdas `(begin . ,body))]))