From e7823c4dacf4247379968129d4b992b27fa1c475 Mon Sep 17 00:00:00 2001 From: Max New Date: Sun, 3 Nov 2013 23:43:24 -0600 Subject: [PATCH] Add unnamed repeat support --- pkgs/redex-pkgs/redex-lib/redex/private/enum.rkt | 16 +++++++++------- .../redex-lib/redex/private/preprocess-pat.rkt | 10 ++++++++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/pkgs/redex-pkgs/redex-lib/redex/private/enum.rkt b/pkgs/redex-pkgs/redex-lib/redex/private/enum.rkt index 06c0e101af..863518d737 100644 --- a/pkgs/redex-pkgs/redex-lib/redex/private/enum.rkt +++ b/pkgs/redex-pkgs/redex-lib/redex/private/enum.rkt @@ -108,7 +108,7 @@ (except/e var/e s)] [`(variable-prefix ,s) ;; todo - (error 'unimplemented "var-prefix")] + (unimplemented "var-prefix")] [`variable-not-otherwise-mentioned unused/e] [`hole @@ -277,7 +277,7 @@ ;; Only works if there are no variables inside the repeat (add-named-rep name named-pats)] [`(repeat ,pat ,name ,mismatch) - (error 'unimplemented)] + (unimplemented "mismatch repeats")] [else (loop sub-pat named-pats)])) named-pats sub-pats)] @@ -470,7 +470,7 @@ (except/e var/e s)] [`(variable-prefix ,s) ;; todo - (error 'unimplemented "var-prefix")] + (unimplemented "var-prefix")] [`variable-not-otherwise-mentioned unused-var/e] [`hole @@ -522,7 +522,7 @@ (many/e (loop pat) n)))] [`(repeat ,pat ,name ,mismatch) - (error 'unimplemented "mismatch-repeat")] + (unimplemented "mismatch-repeat")] [else (loop sub-pat)])) sub-pats))] [(? (compose not pair?)) @@ -560,8 +560,6 @@ (many/e char/e))) (define integer/e - #; ;; Simple "turn down the volume" list - (from-list/e '(0 1 -1)) (sum/e nats (map/e (λ (n) (- (+ n 1))) (λ (n) (- (- n) 1)) @@ -599,7 +597,11 @@ [(decomposition? term) (error 'unsupported "in-hole")] [(list? term) - (map rec term)] + (append* + (for/list ([sub-term (in-list term)]) + (cond [(repeat? sub-term) + (map rec (repeat-terms sub-term))] + [else (list (rec sub-term))])))] [else term])) (rec term)]) diff --git a/pkgs/redex-pkgs/redex-lib/redex/private/preprocess-pat.rkt b/pkgs/redex-pkgs/redex-lib/redex/private/preprocess-pat.rkt index 768fe27377..3d2b789a8f 100644 --- a/pkgs/redex-pkgs/redex-lib/redex/private/preprocess-pat.rkt +++ b/pkgs/redex-pkgs/redex-lib/redex/private/preprocess-pat.rkt @@ -5,6 +5,7 @@ "2set.rkt" "env.rkt" + "error.rkt" "match-a-pattern.rkt") (provide preprocess @@ -24,7 +25,7 @@ pat)] [`(mismatch-name ,n ,subpat) ;; TODO - (error 'unimplemented)] + (unimplemented "mismatch-name")] [`(in-hole ,p1 ,p2) (match-define (ann-pat subenv1 _) (walk p1)) @@ -41,8 +42,10 @@ (define ann-sub-pats (for/list ([sub-pat (in-list sub-pats)]) (match sub-pat + [`(repeat ,p #f #f) + (ann-pat empty-env sub-pat)] [`(repeat ,p ,n ,m) - (error 'unimplemented)] + (unimplemented "named repeat")] [_ (walk sub-pat)]))) (define list-env @@ -125,3 +128,6 @@ (define (pure-ann-pat pat) (ann-pat empty-env pat)) + +(define (unimplemented pat-name) + (redex-error 'unsupported "generate-term #:i-th currently doesn't support pattern type: ~a" pat-name))