-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterp_capture_lazy.rkt
More file actions
60 lines (52 loc) · 1.81 KB
/
interp_capture_lazy.rkt
File metadata and controls
60 lines (52 loc) · 1.81 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
59
60
#lang racket
(require racket/trace)
; (define (interp exp [env (hash)])
; (match exp
; [(? symbol? x) (hash-ref env x (lambda () (error (format "var ~a is undefined" x))))]
; [`(lambda (,x) ,eb) `(closure ,exp ,env)]
; [`(,ef ,ea)
; (define vf (interp ef env))
; (define va (interp ea env))
; (match vf
; [`(closure (lambda (,x) ,eb) ,envlam) (interp eb (hash-set envlam x va))])]))
(define prims `(+ - * /))
(define (prim? op)
(member op prims))
(define (interp exp [env (hash)])
(match exp
[(? number? x) x]
[(? symbol? x) (hash-ref env x (lambda () (error (format "var ~a is undefined" x))))]
[`(lambda (,x) ,eb) `(closure ,exp ,env)]
[`(,op ,x ,y ...) #:when (prim? op)
(define v (interp x env))
(define vs (map (lambda (e) (interp e env)) y))
(apply (eval op (make-base-namespace)) vs)
]
[`(,ef ,ea)
(define vf (interp ef env))
(define va (interp ea env))
(match vf
[`(closure (lambda (,x) ,eb) ,envlam)
(interp eb (hash-set envlam x va))
]
)
]
)
)
; (interp `(+ 1 2))
; (interp `(- 1 2))
; (interp `(* 1 2))
; (interp `(/ 1 2))
; (interp `((lambda (x) (+ x 1)) 2))
; (interp `((lambda (x) (+ x 1)) (+ 1 2)))
; (interp (((lambda (x) (lambda (y) (+ x y))) 1) (+ 1 2)))
; (interp `((lambda (x) (lambda (y) (+ x y))) 1))
; (interp `(((lambda (x) (lambda (y) (+ x y))) 1) (+ 1 z)))
; (interp `(+ 1 2 3 7 8 0 012))
; (interp `(+ 2 3 4 (- 12 3 4)))
; (interp `(((lambda (x) (lambda (y) (+ x y))) 1 (+ 1 2))))
; (interp `((lambda (x) (x x)) (lambda (y) y)))
; (interp `((lambda (z) ((lambda (x) (x x)) (lambda (y) z))) (lambda (w) w)))
; denotational semantics
; operational semantics
; axiomatic semantics