Skip to content

Commit ec9a20e

Browse files
committed
WIP: Loot with new AST
Things left TODO: [x] Rewrite the defunctionalization in terms of the AST [ ] Allow arbitrary 'begin in the program (currently we only support top-level begin)
1 parent 6a86bb8 commit ec9a20e

3 files changed

Lines changed: 43 additions & 31 deletions

File tree

www/notes/loot/ast.rkt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@
7676
;; Expr that represents the value that will be bound to that variable
7777
(struct binding (v e) #:transparent)
7878

79+
80+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
81+
;;;;;; AST nodes for closures (used for pedagogical purposes)
82+
;;;;;; (see interp-defun.rkt)
83+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
84+
85+
(struct closure (fs e env) #:transparent)
86+
(struct rec-closure (lam fenv) #:transparent)
87+
7988
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8089
;;;;;; AST utility functions (predicates)
8190
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

www/notes/loot/interp-defun.rkt

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#lang racket
22
(provide (all-defined-out))
3-
(require "syntax.rkt")
3+
(require "ast.rkt" "syntax.rkt")
44

55
;; type Expr =
66
;; ...
@@ -16,65 +16,68 @@
1616

1717
;; Expr -> Answer
1818
(define (interp e)
19-
(interp-env (desugar e) '()))
19+
(match (desugar-prog e)
20+
[(prog _ e)
21+
(interp-env e '())]))
2022

2123
;; Expr REnv -> Answer
2224
(define (interp-env e r)
2325
(match e
24-
[''() '()]
25-
[(? syntactic-value? v) v]
26-
[(list (? prim? p) es ...)
26+
[(nil-e) '()]
27+
[(int-e i) i]
28+
[(bool-e b) b]
29+
[(prim-e p es)
2730
(match (interp-env* es r)
2831
[(list vs ...) (interp-prim p vs)]
2932
[_ 'err])]
30-
[`(if ,e0 ,e1 ,e2)
33+
[(if-e e0 e1 e2)
3134
(match (interp-env e0 r)
3235
['err 'err]
3336
[v
3437
(if v
3538
(interp-env e1 r)
3639
(interp-env e2 r))])]
37-
[(? symbol? x)
40+
[(var-e x)
3841
(lookup r x)]
39-
[`(let ((,x ,e0)) ,e1)
42+
[(let-e (list (binding x e0)) e1)
4043
(match (interp-env e0 r)
4144
['err 'err]
4245
[v
4346
(interp-env e1 (ext r x v))])]
44-
[`(letrec ,bs ,e)
47+
[(letr-e bs e)
4548
(letrec ((r* (λ ()
4649
(append
47-
(zip (map first bs)
50+
(zip (get-vars bs)
4851
;; η-expansion to delay evaluating r*
4952
;; relies on RHSs being functions
50-
(map (λ (l) `(rec-closure ,l ,r*))
51-
(map second bs)))
53+
(map (λ (l) (rec-closure l r*))
54+
(get-defs bs)))
5255
r))))
5356
(interp-env e (r*)))]
54-
55-
[`(λ (,xs ...) ,e)
56-
`(closure ,xs ,e ,r)]
57-
[`(,e . ,es)
57+
[(lam-e xs e)
58+
(closure xs e r)]
59+
[(app-e e es)
5860
(match (interp-env* (cons e es) r)
5961
[(list (? function? f) vs ...)
6062
(apply apply-function f vs)]
6163
[_ 'err])]))
6264

6365
(define (function? f)
6466
(match f
65-
[`(closure . ,_) #t]
66-
[`(rec-closure . ,_) #t]
67+
[(closure _ _ _) #t]
68+
[(rec-closure _ _) #t]
6769
[_ #f]))
6870

6971
;; Function Value ... -> Answer
7072
(define (apply-function f . vs)
7173
(match f
72-
[`(closure ,xs ,e ,r)
74+
[(closure xs e r)
7375
(if (= (length xs) (length vs))
7476
(interp-env e (append (zip xs vs) r))
7577
'err)]
76-
[`(rec-closure (λ (,xs ...) ,e) ,r*)
77-
(apply apply-function `(closure ,xs ,e ,(r*)) vs)]))
78+
[(rec-closure (lam-e xs e) r*)
79+
; You've got to apply the the r* thunk
80+
(apply apply-function (closure xs e (r*)) vs)]))
7881

7982

8083
;; (Listof Expr) REnv -> (Listof Value) | 'err
@@ -94,9 +97,9 @@
9497

9598
;; Any -> Boolean
9699
(define (syntactic-value? x)
97-
(or (integer? x)
98-
(boolean? x)
99-
(null? x)))
100+
(or (int-e? x)
101+
(bool-e? x)
102+
(nil-e? x)))
100103

101104
;; Prim (Listof Value) -> Answer
102105
(define (interp-prim p vs)
@@ -123,7 +126,8 @@
123126
[(cons (list y i) env)
124127
(match (symbol=? x y)
125128
[#t i]
126-
[#f (lookup env x)])]))
129+
[#f (lookup env x)])]
130+
[_ (error (~a "Lookup failed, var: " x "\n\tthe env: " env))]))
127131

128132
;; Env Variable Value -> Value
129133
(define (ext r x i)

www/notes/loot/test/interp.rkt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,8 @@
159159
[(? procedure?) 'procedure]
160160
[v v])))
161161

162-
; TODO: Change the defunctionalization to work with AST
163-
;(test-suite
164-
; (λ (e)
165-
; (match (defun:interp e)
166-
; [(? defun:function?) 'procedure]
167-
; [v v])))
162+
(test-suite
163+
(λ (e)
164+
(match (defun:interp (sexpr->prog e))
165+
[(? defun:function?) 'procedure]
166+
[v v])))

0 commit comments

Comments
 (0)