diff --git a/syndicate/smart-pattern.rkt b/syndicate/smart-pattern.rkt index 4855b73..379b82c 100644 --- a/syndicate/smart-pattern.rkt +++ b/syndicate/smart-pattern.rkt @@ -32,10 +32,13 @@ (hash-set entries (- npats 1) (Pattern-discard)) entries)) -(define (entries->items entries on-missing) - (define max-key (apply max -1 (hash-keys entries))) - (for/list [(i (in-range 0 (+ max-key 1)))] - (hash-ref entries i on-missing))) +(define (entries->items entries) + (let/ec return + (define keys (hash-keys entries)) + (for [(k (in-list keys))] (unless (exact-nonnegative-integer? k) (return (void)))) + (define max-key (apply max -1 keys)) + (for/list [(i (in-range 0 (+ max-key 1)))] + (hash-ref entries i (lambda () (return void)))))) (define (rec label pats) (Pattern-group (GroupType-rec label) (items->entries pats))) (define (arr pats) (Pattern-group (GroupType-arr) (items->entries pats))) @@ -57,7 +60,10 @@ (define (literal-pattern->literal p) (let/ec return - (define (e->i e) (entries->items e (lambda () (return (void))))) + (define (e->i e) + (match (entries->items e) + [(? void?) (return (void))] + [items items])) (let walk ((p p)) (match p [(Pattern-discard) (return (void))]