Skip to content

Commit 3db76bb

Browse files
authored
Merge pull request #103 from cmsc430/outlaw
Outlaw
2 parents 3a2cc63 + da768ad commit 3db76bb

File tree

16 files changed

+132
-43
lines changed

16 files changed

+132
-43
lines changed

langs/neerdowell/compile-expr.rkt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,11 @@
313313
cm2))])])]
314314
[(PStruct n ps)
315315
(match (compile-struct-patterns ps (cons #f cm) next 1)
316-
[(list i f cm)
316+
[(list i f cm1)
317317
(let ((fail (gensym)))
318318
(list
319-
(seq (Mov r8 rax)
319+
(seq (%%% "struct")
320+
(Mov r8 rax)
320321
(And r8 ptr-mask)
321322
(Cmp r8 type-struct)
322323
(Jne fail)
@@ -331,7 +332,7 @@
331332
(Label fail)
332333
(Add rsp (* 8 (length cm)))
333334
(Jmp next))
334-
cm))])]))
335+
cm1))])]))
335336

336337
;; [Listof Pat] CEnv Symbol Nat -> (list Asm Asm CEnv)
337338
(define (compile-struct-patterns ps cm next i)

langs/neerdowell/interp-defun.rkt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,24 @@
111111
[(PAnd p1 p2)
112112
(match (interp-match-pat p1 v r)
113113
[#f #f]
114-
[r1 (interp-match-pat p2 v r1)])]))
114+
[r1 (interp-match-pat p2 v r1)])]
115+
[(PStruct t ps)
116+
(match v
117+
[(StructVal n vs)
118+
(and (eq? t n)
119+
(interp-match-pats ps (vector->list vs) r))]
120+
[_ #f])]))
121+
122+
;; [Listof Pat] [Listof Val] Env -> [Maybe Env]
123+
(define (interp-match-pats ps vs r)
124+
(match ps
125+
['() r]
126+
[(cons p ps)
127+
(match vs
128+
[(cons v vs)
129+
(match (interp-match-pat p v r)
130+
[#f #f]
131+
[r1 (interp-match-pats ps vs r1)])])]))
115132

116133
;; Id Env [Listof Defn] -> Answer
117134
(define (interp-var x r ds)

langs/neerdowell/interp-prims.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#lang racket
22
(require "ast.rkt")
3-
(provide interp-prim)
3+
(provide interp-prim StructVal)
44

55
;; type Struct = (StructVal Symbol (Vectorof Value))
66
(struct StructVal (name vals))

langs/neerdowell/interp.rkt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,24 @@
108108
[(PAnd p1 p2)
109109
(match (interp-match-pat p1 v r)
110110
[#f #f]
111-
[r1 (interp-match-pat p2 v r1)])]))
111+
[r1 (interp-match-pat p2 v r1)])]
112+
[(PStruct t ps)
113+
(match v
114+
[(StructVal n vs)
115+
(and (eq? t n)
116+
(interp-match-pats ps (vector->list vs) r))]
117+
[_ #f])]))
118+
119+
;; [Listof Pat] [Listof Val] Env -> [Maybe Env]
120+
(define (interp-match-pats ps vs r)
121+
(match ps
122+
['() r]
123+
[(cons p ps)
124+
(match vs
125+
[(cons v vs)
126+
(match (interp-match-pat p v r)
127+
[#f #f]
128+
[r1 (interp-match-pats ps vs r1)])])]))
112129

113130
;; Id Env [Listof Defn] -> Answer
114131
(define (interp-var x r ds)

langs/neerdowell/test/test-runner.rkt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,13 @@
428428
#f)
429429
(check-equal? (run '(struct foo (x))
430430
'(foo-x #t))
431-
'err))
431+
'err)
432+
(check-equal? (run '(struct foo (x))
433+
'(struct bar (y))
434+
'(match (bar 5)
435+
[(foo x) #f]
436+
[(bar x) x]))
437+
5))
432438

433439
(define (test-runner-io run)
434440
;; Evildoer examples

langs/outlaw/compile-expr.rkt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@
340340
cm2))])])]
341341
[(PStruct n ps)
342342
(match (compile-struct-patterns ps c g (cons #f cm) next 1)
343-
[(list i f cm)
343+
[(list i f cm1)
344344
(let ((fail (gensym)))
345345
(list
346346
(seq (Mov r8 rax)
@@ -358,7 +358,7 @@
358358
(Label fail)
359359
(Add rsp (*8 (length cm)))
360360
(Jmp next))
361-
cm))])]
361+
cm1))])]
362362

363363
[(PPred e)
364364
(let ((fail (gensym 'fail)))

langs/outlaw/compile-ops.rkt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
(unpad-stack))]
133133
['error
134134
(seq (assert-string rax)
135+
(Xor rax type-str)
135136
(Mov rdi rax)
136137
(pad-stack)
137138
(Call 'raise_error))]
@@ -146,6 +147,19 @@
146147
(pad-stack)
147148
(Call 'is_char_alphabetic)
148149
(unpad-stack))]
150+
['char-whitespace?
151+
(seq (assert-char rax)
152+
(Sar rax char-shift)
153+
(Mov rdi rax)
154+
(pad-stack)
155+
(Call 'is_char_whitespace)
156+
(unpad-stack))]
157+
['write-char
158+
(seq (assert-char rax)
159+
(Mov rdi rax)
160+
(pad-stack)
161+
(Call 'print_codepoint_out)
162+
(unpad-stack))]
149163

150164
;; Op2
151165
['+

langs/outlaw/compile-stdin.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#lang racket
2-
(require "parse.rkt" "compile.rkt" "read-all.rkt" "a86/printer.rkt")
2+
(require "stdlib.rkt" "parse.rkt" "compile.rkt" "read-all.rkt" "a86/printer.rkt")
33
(provide main)
44

55
;; -> Void

langs/outlaw/compile.rkt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,18 @@
5858
'(list list* make-list list? foldr map filter length append append*
5959
memq member append-map vector->list
6060
reverse
61-
number->string gensym read read-char
61+
number->string gensym read read-char peek-char
6262
> <= >=
6363
void?
6464
list->string string->list
65-
char<=?
65+
char<=? char=?
6666
remove-duplicates remq* remove* remove
6767
andmap vector list->vector boolean?
6868
substring odd?
6969
system-type ;; hard-coded
7070
not findf
7171
read-line
72+
exact->inexact / expt string->keyword ; unimplemented
7273
;; Op0
7374
read-byte peek-byte void
7475
;; Op1
@@ -80,7 +81,7 @@
8081
string->uninterned-symbol
8182
open-input-file
8283
write-char error integer?
83-
eq-hash-code char-alphabetic?
84+
eq-hash-code char-alphabetic? char-whitespace? displayln
8485
;; Op2
8586
+ - < = cons eq? make-vector vector-ref
8687
make-string string-ref string-append
@@ -103,6 +104,8 @@
103104
read_byte_port
104105
peek_byte_port
105106
is_char_alphabetic
107+
is_char_whitespace
108+
print_codepoint_out
106109
system_type)))
107110

108111
(define cons-function

langs/outlaw/io.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#define port_buffer_bytes 8
1010

1111
void utf8_encode_string(val_str_t *, char *);
12+
int utf8_encode_char(val_char_t, char *);
1213

1314
val_t read_byte(void)
1415
{
@@ -30,6 +31,14 @@ val_t write_byte(val_t c)
3031
return val_wrap_void();
3132
}
3233

34+
val_t print_codepoint_out(val_t c)
35+
{
36+
char buffer[5] = {0};
37+
utf8_encode_char(val_unwrap_char(c), buffer);
38+
fprintf(out, "%s", buffer);
39+
return val_wrap_void();
40+
}
41+
3342
val_t open_input_file(val_t in) {
3443
FILE *f;
3544
char *buf;

0 commit comments

Comments
 (0)