Implement nested named repeats, remove mismatch name tests for now
This commit is contained in:
parent
3b64ee8c81
commit
707bd5f20d
|
@ -3,7 +3,7 @@
|
|||
(provide (struct-out env)
|
||||
empty-env
|
||||
add-name
|
||||
add-nrep
|
||||
pure-nrep
|
||||
env-union
|
||||
(struct-out t-env)
|
||||
t-env-name-ref
|
||||
|
@ -36,23 +36,18 @@
|
|||
(define update identity)
|
||||
(env (hash-update names n update default) nreps)])
|
||||
|
||||
(: add-nrep : Env Symbol Env Tag Pattern -> Env)
|
||||
(define/match (add-nrep e n repnv tag pat)
|
||||
[((env names nreps) _ _ _ _)
|
||||
(: update-nreps : (Pairof Env (Tagged Pattern)) -> (Pairof Env (Tagged Pattern)))
|
||||
(define/match (update-nreps e-t)
|
||||
[((cons nv tagged))
|
||||
(cons (env-union nv repnv)
|
||||
(hash-set tagged tag pat))])
|
||||
(: default : (-> (Pairof Env (Tagged Pattern))))
|
||||
(define (default)
|
||||
(: tagged : (Tagged Pattern))
|
||||
(define tagged (hash-set (ann (hash) (Tagged Pattern))
|
||||
tag pat))
|
||||
(cons repnv tagged))
|
||||
(env names
|
||||
(hash-update nreps n update-nreps default
|
||||
))])
|
||||
(: pure-nrep : Symbol Env Tag Pattern -> Env)
|
||||
(define (pure-nrep n repnv tag pat)
|
||||
(: nreps : (HashTable Symbol (Pairof Env (Tagged Pattern))))
|
||||
(define nreps
|
||||
(hash-set (ann (hash) (HashTable Symbol (Pairof Env (Tagged Pattern))))
|
||||
n
|
||||
(cons repnv
|
||||
(hash-set (ann (hash) (Tagged Pattern))
|
||||
tag
|
||||
pat))))
|
||||
(env (hash)
|
||||
nreps))
|
||||
|
||||
(: t-env-name-ref : TEnv Symbol -> Pattern)
|
||||
(define/match (t-env-name-ref e n)
|
||||
|
@ -71,12 +66,12 @@
|
|||
(define names-union
|
||||
(hash-union ns1
|
||||
ns2
|
||||
(λ (v1 v2) v1)))
|
||||
(: combo : (Pairof Env (Tagged Pattern)) (Pairof Env (Tagged Pattern)) -> (Pairof Env (Tagged Pattern)))
|
||||
(define/match (combo e-t1 e-t2)
|
||||
[((cons nv1 t1) (cons nv2 t2))
|
||||
(λ (_ v1 v2) v1)))
|
||||
(: combo : Symbol (Pairof Env (Tagged Pattern)) (Pairof Env (Tagged Pattern)) -> (Pairof Env (Tagged Pattern)))
|
||||
(define/match (combo _ e-t1 e-t2)
|
||||
[(_ (cons nv1 t1) (cons nv2 t2))
|
||||
(cons (env-union nv1 nv2)
|
||||
(hash-union t1 t2 (λ (_1 _2) (error "2 tags should never collide"))))])
|
||||
(hash-union t1 t2 (λ (t _1 _2) (error (format "2 tags should never collide, but these did: ~s, ~s with tag: ~s in envs ~s and ~s" _1 _2 t e1 e2)))))])
|
||||
(define nreps-union
|
||||
(hash-union rs1 rs2 combo))
|
||||
(env names-union nreps-union)])
|
||||
|
@ -85,7 +80,7 @@
|
|||
(define (key-set m)
|
||||
(list->set (hash-keys m)))
|
||||
|
||||
(: hash-union : (All (k v) (HashTable k v) (HashTable k v) (v v -> v) -> (HashTable k v)))
|
||||
(: hash-union : (All (k v) (HashTable k v) (HashTable k v) (k v v -> v) -> (HashTable k v)))
|
||||
(define (hash-union m1 m2 combo)
|
||||
(: ks1 : (Setof k))
|
||||
(: ks2 : (Setof k))
|
||||
|
@ -98,6 +93,6 @@
|
|||
(define v2 (hash-ref m2 k (thunk #f)))
|
||||
(define v
|
||||
(cond [(and v1 v2)
|
||||
(combo v1 v2)]
|
||||
(combo k v1 v2)]
|
||||
[else (or v1 v2 (error "absurd"))]))
|
||||
(values k v)))
|
||||
|
|
|
@ -50,15 +50,14 @@
|
|||
[`(repeat ,p #f #f)
|
||||
(ann-pat empty-env sub-pat)]
|
||||
[`(repeat ,p ,n #f)
|
||||
(match-define (ann-pat subenv _)
|
||||
(match-define (ann-pat subenv subp)
|
||||
(walk p))
|
||||
(define tag (get-and-inc!))
|
||||
(ann-pat (add-nrep empty-env n subenv tag p)
|
||||
(ann-pat (pure-nrep n subenv tag subp)
|
||||
`(repeat ,tag ,n #f))]
|
||||
[`(repeat ,p ,n ,m)
|
||||
(unimplemented (format "mismatch repeat (..._!_): ~s ~s" n m))]
|
||||
[_ (walk sub-pat)])))
|
||||
|
||||
(define list-env
|
||||
(for/fold ([accenv empty-env])
|
||||
([sub-apat (in-list ann-sub-pats)])
|
||||
|
|
|
@ -86,7 +86,8 @@
|
|||
(p (number_!_1 number_!_1))
|
||||
(n (p_!_1 p_!_1))
|
||||
(x number))
|
||||
|
||||
;; Mismatch isn't working for now, will come back to this.
|
||||
#;#;#;
|
||||
(try-it 100 M m)
|
||||
(try-it 100 M n)
|
||||
(try-it 100 M p)
|
||||
|
@ -98,14 +99,20 @@
|
|||
|
||||
(try-it 20 VarMentioned var)
|
||||
|
||||
;; Named repeats
|
||||
(define-language NRep
|
||||
(v (natural ..._1 natural ..._1))
|
||||
(v2 (v ..._1 v ..._2 v ..._1 v ..._2))
|
||||
(v3 (natural_1 ..._1 natural_1 ..._1)))
|
||||
(v3 (natural_1 ..._1 natural_1 ..._1))
|
||||
(v4 (((natural_1 #t) ..._1) ..._2 ((#f natural_1) ..._1) ..._2))
|
||||
;; The motherlode
|
||||
(v5 ((string_7 (((natural_1 variable_2) ..._1 any_3) ..._2)) ..._3 (((any_3 (variable_2 natural_1) ..._1) ..._2) string_7) ..._3)))
|
||||
|
||||
(try-it 100 NRep v)
|
||||
(try-it 100 NRep v2)
|
||||
(try-it 100 NRep v3)
|
||||
(try-it 100 NRep v4)
|
||||
(try-it 100 NRep v5)
|
||||
|
||||
;; Test production sort
|
||||
(define-language rec
|
||||
|
|
Loading…
Reference in New Issue
Block a user