Skip to content

Commit b0415e7

Browse files
committed
Revise all double-bounded limits in Ziggy
Original implementation for most limits with two bounds assumed a right-inclusive system, but Crook's implementation is right-exclusive. Installing the `langs` package now succeeds for all files, with the exception of the explicitly disabled languages (Abscond, Blackmail, Con, and Dupe).
1 parent fbc34ed commit b0415e7

File tree

11 files changed

+101
-102
lines changed

11 files changed

+101
-102
lines changed

ziggy/src/ast.rkt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#lang crook
22
{:= A B C D0 D0.A D1 E0 E1 F H0 H1 I J K}
3-
(provide {:> A} Lit {:> E0} Prim0 {:> B} Prim1 {:> F} Prim2 {:> H1} Prim3 {:> C C} IfZero {:> D0} If {:> E0} Eof {:> E0} Begin
4-
{:> F} Let {:> F} Var {:> H0} Empty {:> I} Prog {:> I} Defn {:> I} App
3+
(provide {:> A} Lit {:> E0} Prim0 {:> B} Prim1 {:> F} Prim2 {:> H1} Prim3
4+
{:> C D0} IfZero {:> D0} If {:> E0} Eof {:> E0} Begin {:> F} Let
5+
{:> F} Var {:> H0} Empty {:> I} Prog {:> I} Defn {:> I} App
56
{:> K} Match {:> K} Box {:> K} Cons {:> K} Conj)
67
;;
78

@@ -11,28 +12,28 @@
1112
{:> I} ;; type Defn = (Defn Id (Listof Id) Expr)
1213
{:> I} (struct Defn (f xs e) #:prefab)
1314

14-
{:> A C} ;; type Expr = (Lit Integer)
15+
{:> A D0} ;; type Expr = (Lit Integer)
1516
{:> D0} ;; type Expr = (Lit Datum)
1617
{:> E0} ;; | (Eof)
1718
{:> H0} ;; | (Empty)
1819
{:> E0} ;; | (Prim0 Op0)
1920
{:> B} ;; | (Prim1 Op1 Expr)
2021
{:> F} ;; | (Prim2 Op2 Expr Expr)
2122
{:> H1} ;; | (Prim3 Op3 Expr Expr Expr)
22-
{:> C C} ;; | (IfZero Expr Expr Expr)
23+
{:> C D0} ;; | (IfZero Expr Expr Expr)
2324
{:> D0} ;; | (If Expr Expr Expr)
24-
{:> D0.A D0.A}
25+
{:> D0.A D1}
2526
;; | (Cond [Listof CondClause] Expr)
26-
{:> D0.A D0.A}
27+
{:> D0.A D1}
2728
;; | (Case Expr [Listof CaseClause] Expr)
2829
{:> F} ;; | (Let Id Expr Expr)
2930
{:> F} ;; | (Var Id)
3031
{:> I} ;; | (App Id (Listof Expr))
3132
{:> K} ;; | (Match Expr (Listof Pat) (Listof Expr))
3233

33-
{:> D0.A D0.A}
34+
{:> D0.A D1}
3435
;; type CondClause = (Clause Expr Expr)
35-
{:> D0.A D0.A}
36+
{:> D0.A D1}
3637
;; type CaseClause = (Clause [Listof Datum] Expr)
3738

3839
{:> F} ;; type Id = Symbol
@@ -43,7 +44,7 @@
4344
{:> E0} ;; type Op0 = 'read-byte | 'peek-byte | 'void
4445
{:> B} ;; type Op1 = 'add1 | 'sub1
4546
{:> D0} ;; | 'zero?
46-
{:> D0.A D0.A}
47+
{:> D0.A D1}
4748
;; | 'abs | '- | 'not
4849
{:> D1} ;; | 'char? | 'integer->char | 'char->integer
4950
{:> E0} ;; | 'write-byte | 'eof-object?
@@ -64,13 +65,13 @@
6465

6566
{:> E0} (struct Eof () #:prefab)
6667
{:> H0} (struct Empty () #:prefab)
67-
{:> A C} (struct Lit (i) #:prefab)
68+
{:> A D0} (struct Lit (i) #:prefab)
6869
{:> D0} (struct Lit (d) #:prefab)
6970
{:> E0} (struct Prim0 (p) #:prefab)
7071
{:> B} (struct Prim1 (p e) #:prefab)
7172
{:> F} (struct Prim2 (p e1 e2) #:prefab)
7273
{:> H1} (struct Prim3 (p e1 e2 e3) #:prefab)
73-
{:> C C} (struct IfZero (e1 e2 e3) #:prefab)
74+
{:> C D0} (struct IfZero (e1 e2 e3) #:prefab)
7475
{:> D0} (struct If (e1 e2 e3) #:prefab)
7576
{:> E0} (struct Begin (e1 e2) #:prefab)
7677
{:> F} (struct Let (x e1 e2) #:prefab)

ziggy/src/compile-ops.rkt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,18 @@
2727
;; Op1 -> Asm
2828
(define (compile-op1 p)
2929
(match p
30-
{:> B C} ['add1 (Add rax 1)]
31-
{:> B C} ['sub1 (Sub rax 1)]
32-
{:> D0 E0} ['add1 (Add rax (value->bits 1))]
30+
{:> B D0} ['add1 (Add rax 1)]
31+
{:> B D0} ['sub1 (Sub rax 1)]
32+
{:> D0 E1} ['add1 (Add rax (value->bits 1))]
3333
{:> E1} ['add1
3434
(seq (assert-integer rax)
3535
(Add rax (value->bits 1)))]
36-
{:> D0 E0} ['sub1 (Sub rax (value->bits 1))]
36+
{:> D0 E1} ['sub1 (Sub rax (value->bits 1))]
3737
{:> E1} ['sub1
3838
(seq (assert-integer rax)
3939
(Sub rax (value->bits 1)))]
4040
{:> D0} ['zero?
41-
{:> D0 D0.A}
41+
{:> D0 D1}
4242
(seq (Cmp rax 0)
4343
(Mov rax (value->bits #f))
4444
(Mov r9 (value->bits #t))
@@ -88,7 +88,7 @@
8888
(seq (assert-cons rax)
8989
(Xor rax type-cons)
9090
(Mov rax (Offset rax 0)))]
91-
91+
9292
{:> H0} ['empty? (seq (Cmp rax (value->bits '())) if-equal)]
9393
{:> H0} ['cons? (type-pred ptr-mask type-cons)]
9494
{:> H0} ['box? (type-pred ptr-mask type-box)]
@@ -121,7 +121,7 @@
121121
(Label zero)
122122
(Mov rax 0)
123123
(Label done)))]))
124-
124+
125125

126126
{:> F} ;; Op2 -> Asm
127127
{:> F}
@@ -148,7 +148,7 @@
148148
(seq (Pop r8)
149149
(assert-integer r8)
150150
(assert-integer rax)
151-
(Cmp r8 rax)
151+
(Cmp r8 rax)
152152
if-equal)]
153153
{:> H0}
154154
['cons

ziggy/src/compile.rkt

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
(provide (all-defined-out))
44
(require "ast.rkt")
55
{:> B} (require "compile-ops.rkt")
6-
{:> D0 } (require "types.rkt")
6+
{:> D0} (require "types.rkt")
77
(require a86/ast)
88

99
(define rax 'rax)
@@ -13,9 +13,9 @@
1313
{:> J} (define r8 'r8) {:> J} ; scratch
1414
{:> F} (define r15 'r15) {:> F} ; stack pad (non-volatile)
1515

16-
{:> A H0} ;; Expr -> Asm
17-
{:> A H0}
18-
(define (compile e)
16+
{:> A I} ;; Expr -> Asm
17+
{:> A I}
18+
(define (compile e)
1919
(prog (Global 'entry)
2020
{:> E0} (Extern 'peek_byte)
2121
{:> E0} (Extern 'read_byte)
@@ -86,7 +86,7 @@
8686
{:> J} ;; Expr CEnv Boolean -> Asm
8787
(define (compile-e e {:> F} c {:> J} t?)
8888
(match e
89-
{:> A C}
89+
{:> A D0}
9090
[(Lit i) (seq (Mov rax i))]
9191
{:> D0}
9292
[(Lit d) (compile-value d)]
@@ -95,7 +95,7 @@
9595
{:> H0}
9696
[(Empty) (compile-value '())]
9797
{:> F}
98-
[(Var x) (compile-variable x c)]
98+
[(Var x) (compile-variable x c)]
9999
{:> E0}
100100
[(Prim0 p) (compile-prim0 p)]
101101
{:> B}
@@ -104,7 +104,7 @@
104104
[(Prim2 p e1 e2) (compile-prim2 p e1 e2 c)]
105105
{:> H1}
106106
[(Prim3 p e1 e2 e3) (compile-prim3 p e1 e2 e3 c)]
107-
{:> C C}
107+
{:> C D0}
108108
[(IfZero e1 e2 e3)
109109
(compile-ifzero e1 e2 e3)]
110110
{:> D0}
@@ -125,7 +125,7 @@
125125
{:> D0} ;; Value -> Asm
126126
{:> D0}
127127
(define (compile-value v)
128-
{:> D0 H0}
128+
{:> D0 H1}
129129
(seq (Mov rax (value->bits v)))
130130
{:> H1}
131131
(cond [(string? v) (compile-string v)]
@@ -166,8 +166,8 @@
166166
(define (compile-prim0 p)
167167
(compile-op0 p))
168168

169-
{:> B H0} ;; Op1 Expr -> Asm
170-
{:> F} ;; Op1 Expr CEnv -> Asm
169+
{:> B F} ;; Op1 Expr -> Asm
170+
{:> F} ;; Op1 Expr CEnv -> Asm
171171
{:> B}
172172
(define (compile-prim1 p e {:> F} c)
173173
(seq (compile-e e {:> F} c {:> J} #f)
@@ -192,8 +192,8 @@
192192
(compile-op3 p)))
193193

194194

195-
{:> C C} ;; Expr Expr Expr -> Asm
196-
{:> C C}
195+
{:> C D0} ;; Expr Expr Expr -> Asm
196+
{:> C D0}
197197
(define (compile-ifzero e1 e2 e3)
198198
(let ((l1 (gensym 'ifz))
199199
(l2 (gensym 'ifz)))
@@ -206,9 +206,9 @@
206206
(compile-e e3)
207207
(Label l2))))
208208

209-
{:> D0 H0} ;; Expr Expr Expr -> Asm
210-
{:> F I} ;; Expr Expr Expr CEnv -> Asm
211-
{:> J} ;; Expr Expr Expr CEnv Boolean -> Asm
209+
{:> D0 F} ;; Expr Expr Expr -> Asm
210+
{:> F J} ;; Expr Expr Expr CEnv -> Asm
211+
{:> J} ;; Expr Expr Expr CEnv Boolean -> Asm
212212
{:> D0}
213213
(define (compile-if e1 e2 e3 {:> F} c {:> J} t?)
214214
(let ((l1 (gensym 'if))
@@ -222,16 +222,16 @@
222222
(compile-e e3 {:> F} c {:> J} t?)
223223
(Label l2))))
224224

225-
{:> E0 H0} ;; Expr Expr -> Asm
226-
{:> F I} ;; Expr Expr CEnv -> Asm
227-
{:> J} ;; Expr Expr CEnv Boolean -> Asm
225+
{:> E0 F} ;; Expr Expr -> Asm
226+
{:> F J} ;; Expr Expr CEnv -> Asm
227+
{:> J} ;; Expr Expr CEnv Boolean -> Asm
228228
{:> E0}
229229
(define (compile-begin e1 e2 {:> F} c {:> J} t?)
230230
(seq (compile-e e1 {:> F} c {:> J} #f)
231231
(compile-e e2 {:> F} c {:> J} t?)))
232232

233-
{:> F I} ;; Id Expr Expr CEnv -> Asm
234-
{:> J} ;; Id Expr Expr CEnv -> Asm
233+
{:> F J} ;; Id Expr Expr CEnv -> Asm
234+
{:> J} ;; Id Expr Expr CEnv Boolean -> Asm
235235
{:> F}
236236
(define (compile-let x e1 e2 c {:> J} t?)
237237
(seq (compile-e e1 c {:> J} t?)
@@ -267,7 +267,7 @@
267267
{:> I} ;; Id [Listof Expr] CEnv -> Asm
268268
{:> I} ;; The return address is placed above the arguments, so callee pops
269269
{:> I} ;; arguments and return address is next frame
270-
{:> I I}
270+
{:> I J}
271271
(define (compile-app f es c)
272272
(let ((r (gensym 'ret)))
273273
(seq (Lea rax r)
@@ -299,7 +299,7 @@
299299
{:> K} ;; Expr [Listof Pat] [Listof Expr] CEnv Bool -> Asm
300300
{:> K}
301301
(define (compile-match e ps es c t?)
302-
(let ((done (gensym)))
302+
(let ((done (gensym)))
303303
(seq (compile-e e c #f)
304304
(Push rax) ; save away to be restored by each clause
305305
(compile-match-clauses ps es (cons #f c) done t?)

ziggy/src/interp-prim.rkt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#lang crook
22
{:= B C D0 D0.A D1 E0 E1 F H0 H1 I J K}
3-
(provide {:> E0} interp-prim0 interp-prim1 {:> F} interp-prim2 {:> H1} interp-prim3)
3+
(provide {:> E0} interp-prim0 {:> B} interp-prim1 {:> F} interp-prim2 {:> H1} interp-prim3)
44

55
{:> E0} ;; Op0 -> Value
66
{:> E0}
@@ -10,15 +10,15 @@
1010
['peek-byte (peek-byte)]
1111
['void (void)]))
1212

13-
{:> B C} ;; Op1 Integer -> Integer
14-
{:> B C}
13+
{:> B D0} ;; Op1 Integer -> Integer
14+
{:> B D0}
1515
(define (interp-prim1 op i)
1616
(match op
1717
['add1 (add1 i)]
1818
['sub1 (sub1 i)]))
1919

20-
{:> D0 E0} ;; Op1 Value -> Value
21-
{:> D0 E0}
20+
{:> D0 E1} ;; Op1 Value -> Value
21+
{:> D0 E1}
2222
(define (interp-prim1 op v)
2323
(match op
2424
['add1 (add1 v)]

ziggy/src/interp.rkt

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,29 @@
2020

2121
{:> F} ;; type Env = (Listof (List Id Value))
2222

23-
{:> A C} ;; Expr -> Integer
24-
{:> D0 E0} ;; Expr -> Value
25-
{:> E1 H1} ;; Expr -> Answer
23+
{:> A D0} ;; Expr -> Integer
24+
{:> D0 E1} ;; Expr -> Value
25+
{:> E1 I} ;; Expr -> Answer
2626
{:> I} ;; Prog -> Answer
27-
(define (interp {:> A H1} e {:> I} p)
28-
{:> F H1}
29-
(interp-env e '())
30-
{:> I}
31-
(match p
32-
[(Prog ds e)
33-
(interp-env e '() ds)])
34-
{:> A H1}
27+
(define (interp {:> A I} e {:> I} p)
28+
{:> A F}
3529
(match e
36-
{:> A C} [(Lit i) i]
30+
{:> A D0} [(Lit i) i]
3731
{:> D0} [(Lit d) d]
3832
{:> E0} [(Eof) eof]
3933
{:> E0} [(Prim0 p)
4034
(interp-prim0 p)]
41-
{:> B E0} [(Prim1 p e)
35+
{:> B E1} [(Prim1 p e)
4236
(interp-prim1 p (interp e))]
4337
{:> E1} [(Prim1 p e)
4438
(match (interp e)
4539
['err 'err]
4640
[v (interp-prim1 p v)])]
47-
{:> C C} [(IfZero e1 e2 e3)
41+
{:> C D0} [(IfZero e1 e2 e3)
4842
(if (zero? (interp e1))
4943
(interp e2)
5044
(interp e3))]
51-
{:> D0 E0} [(If e1 e2 e3)
45+
{:> D0 E1} [(If e1 e2 e3)
5246
(if (interp e1)
5347
(interp e2)
5448
(interp e3))]
@@ -58,13 +52,19 @@
5852
[v (if v
5953
(interp e2)
6054
(interp e3))])]
61-
{:> E0 E0} [(Begin e1 e2)
55+
{:> E0 E1} [(Begin e1 e2)
6256
(begin (interp e1)
6357
(interp e2))]
6458
{:> E1} [(Begin e1 e2)
6559
(match (interp e1)
6660
['err 'err]
67-
[v (interp e2)])]))
61+
[v (interp e2)])])
62+
{:> F I}
63+
(interp-env e '())
64+
{:> I}
65+
(match p
66+
[(Prog ds e)
67+
(interp-env e '() ds)]))
6868

6969
{:> F} ;; Expr Env -> Answer
7070
{:> F}
@@ -202,4 +202,3 @@
202202
{:> F}
203203
(define (ext r x v)
204204
(cons (list x v) r))
205-

ziggy/src/parse.rkt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
(provide parse {:> I} parse-e {:> I} parse-define)
44
(require "ast.rkt")
55

6-
{:> A H1} ;; S-Expr -> Expr
7-
{:> A H1}
6+
{:> A I} ;; S-Expr -> Expr
7+
{:> A I}
88
(define (parse s)
99
(match s
1010
{:> E0}
1111
['eof (Eof)]
12-
{:> A C}
12+
{:> A D0}
1313
[(? exact-integer?) (Lit s)]
1414
{:> D0}
1515
[(? datum?) (Lit s)]
@@ -27,7 +27,7 @@
2727
[(list (? op3? o) e1 e2 e3) (Prim3 o (parse e1) (parse e2) (parse e3))]
2828
{:> E0}
2929
[(list 'begin e1 e2) (Begin (parse e1) (parse e2))]
30-
{:> C C}
30+
{:> C D0}
3131
[(list 'if (list 'zero? e1) e2 e3)
3232
(IfZero (parse e1) (parse e2) (parse e3))]
3333
{:> D0}
@@ -80,7 +80,7 @@
8080
(Let x (parse-e e1) (parse-e e2))]
8181
{:> K}
8282
[(cons 'match (cons e ms))
83-
(parse-match (parse-e e) ms)]
83+
(parse-match (parse-e e) ms)]
8484
[(cons (? symbol? f) es)
8585
(App f (map parse-e es))]
8686
[_ (error "Parse error" s)]))

0 commit comments

Comments
 (0)