From 2a88896e09664222355455591520d2a0459393e0 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Tue, 9 Apr 2024 14:57:46 +0200 Subject: [PATCH] Further checks --- syndicate/smart-pattern.rkt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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))]