File tree Expand file tree Collapse file tree 16 files changed +132
-43
lines changed
Expand file tree Collapse file tree 16 files changed +132
-43
lines changed Original file line number Diff line number Diff line change 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)
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)
Original file line number Diff line number Diff line change 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)
Original file line number Diff line number Diff line change 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))
Original file line number Diff line number Diff line change 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)
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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)
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 )))
Original file line number Diff line number Diff line change 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 ))]
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 ['+
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
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
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
Original file line number Diff line number Diff line change 99#define port_buffer_bytes 8
1010
1111void utf8_encode_string (val_str_t * , char * );
12+ int utf8_encode_char (val_char_t , char * );
1213
1314val_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+
3342val_t open_input_file (val_t in ) {
3443 FILE * f ;
3544 char * buf ;
You can’t perform that action at this time.
0 commit comments