Skip to content

Commit 5761241

Browse files
committed
Add string patterns.
1 parent b9bdc36 commit 5761241

18 files changed

Lines changed: 74 additions & 12 deletions

langs/mountebank/ast.rkt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
;; | (PCons Pat Pat)
5252
;; | (PAnd Pat Pat)
5353
;; | (PSymb Symbol)
54+
;; | (PStr String)
5455
;; type Lit = Boolean
5556
;; | Character
5657
;; | Integer
@@ -77,3 +78,4 @@
7778
(struct PCons (p1 p2) #:prefab)
7879
(struct PAnd (p1 p2) #:prefab)
7980
(struct PSymb (s) #:prefab)
81+
(struct PStr (s) #:prefab)

langs/mountebank/compile-expr.rkt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,24 @@
232232
(list (seq (Push rax))
233233
(seq)
234234
(cons x cm))]
235+
[(PStr s)
236+
(let ((fail (gensym)))
237+
(list (seq (Lea rdi (symbol->data-label (string->symbol s)))
238+
(Mov r8 rax)
239+
(And r8 ptr-mask)
240+
(Cmp r8 type-str)
241+
(Jne fail)
242+
(Xor rax type-str)
243+
(Mov rsi rax)
244+
pad-stack
245+
(Call 'symb_cmp)
246+
unpad-stack
247+
(Cmp rax 0)
248+
(Jne fail))
249+
(seq (Label fail)
250+
(Add rsp (* 8 (length cm)))
251+
(Jmp next))
252+
cm))]
235253
[(PSymb s)
236254
(let ((fail (gensym)))
237255
(list (seq (Lea r9 (Plus (symbol->data-label s) type-symb))

langs/mountebank/compile-literals.rkt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@
5555
[(Prog ds e)
5656
(append (append-map literals-d ds) (literals-e e))]))
5757

58+
;; Defn -> [Listof (U Symbol String)]
5859
(define (literals-d d)
5960
(match d
6061
[(Defn f xs e)
6162
(literals-e e)]))
6263

64+
;; Expr -> [Listof (U Symbol String)]
6365
(define (literals-e e)
6466
(match e
6567
[(Quote d) (literals-datum d)]
@@ -87,10 +89,11 @@
8789
(define (literals-match-clause p e)
8890
(append (literals-pat p) (literals-e e)))
8991

90-
;; Pat -> [Listof Symbol]
92+
;; Pat -> [Listof (U Symbol String)]
9193
(define (literals-pat p)
9294
(match p
9395
[(PSymb s) (list s)]
96+
[(PStr s) (list s)]
9497
[(PBox p) (literals-pat p)]
9598
[(PCons p1 p2) (append (literals-pat p1) (literals-pat p2))]
9699
[(PAnd p1 p2) (append (literals-pat p1) (literals-pat p2))]

langs/mountebank/compile.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@
4444
(Extern 'write_byte)
4545
(Extern 'raise_error)
4646
(Extern 'intern_symbol)
47+
(Extern 'symb_cmp)
4748
(Extern 'memcpy)))

langs/mountebank/interp-defun.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
[(PWild) r]
106106
[(PVar x) (ext r x v)]
107107
[(PSymb s) (and (eq? s v) r)]
108+
[(PStr s) (and (string? v) (string=? s v) r)]
108109
[(PLit l) (and (eqv? l v) r)]
109110
[(PBox p)
110111
(match v

langs/mountebank/interp.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
[(PWild) r]
105105
[(PVar x) (ext r x v)]
106106
[(PSymb s) (and (eq? s v) r)]
107+
[(PStr s) (and (string? v) (string=? s v) r)]
107108
[(PLit l) (and (eqv? l v) r)]
108109
[(PBox p)
109110
(match v

langs/mountebank/parse.rkt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
[(? char?) (PLit p)]
6868
['_ (PWild)]
6969
[(? symbol?) (PVar p)]
70+
[(? string?) (PStr p)]
7071
[(list 'quote s) (PSymb s)]
7172
[(list 'quote (list))
7273
(PLit '())]

langs/mountebank/symbol.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ val_symb_t *intern_symbol(val_symb_t* symb)
3838

3939
int symb_cmp(const val_symb_t *s1, const val_symb_t *s2)
4040
{
41+
if (s1 == s2) return 0;
42+
4143
int64_t len1 = s1->len;
4244
int64_t len2 = s2->len;
4345

langs/mountebank/test/test-runner.rkt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@
312312
(check-equal? (run '(eq? (match #t [_ 'foo]) 'bar)) #f)
313313
(check-equal? (run '(match 'foo ['bar #t] [_ #f])) #f)
314314
(check-equal? (run '(match 'foo ['foo #t] [_ #f])) #t)
315+
(check-equal? (run '(match "foo" ["foo" #t] [_ #f])) #t)
316+
(check-equal? (run '(match "foo" ["bar" #t] [_ #f])) #f)
315317

316318
;; Mountebank examples
317319
(check-equal? (run '#())

langs/mug/ast.rkt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
;; | (PCons Pat Pat)
4949
;; | (PAnd Pat Pat)
5050
;; | (PSymb Symbol)
51+
;; | (PStr String)
5152
;; type Lit = Boolean
5253
;; | Character
5354
;; | Integer
@@ -79,3 +80,4 @@
7980
(struct PCons (p1 p2) #:prefab)
8081
(struct PAnd (p1 p2) #:prefab)
8182
(struct PSymb (s) #:prefab)
83+
(struct PStr (s) #:prefab)

0 commit comments

Comments
 (0)