diff --git a/collects/redex/private/judgment-form.rkt b/collects/redex/private/judgment-form.rkt index 4198bb0320..9912acde89 100644 --- a/collects/redex/private/judgment-form.rkt +++ b/collects/redex/private/judgment-form.rkt @@ -376,7 +376,10 @@ (define-syntax-class horizontal-line (pattern x:id #:when (horizontal-line? #'x))) (define-syntax-class name - (pattern x #:when (string? (syntax-e #'x)))) + (pattern x #:when (or (and (symbol? (syntax-e #'x)) + (not (horizontal-line? #'x)) + (not (eq? '... (syntax-e #'x)))) + (string? (syntax-e #'x))))) (define (parse-rules rules) (define-values (backward-rules backward-names) (for/fold ([parsed-rules '()] @@ -432,14 +435,23 @@ (not extension?) (raise-syntax-error #f "expected at least one rule" full-stx)] [_ (defined-name (list name/mode name/contract) rules full-stx)])) - (values form-name dup-names mode-stx contract rules rule-names)) + (define string-rule-names + (for/list ([name (in-list rule-names)]) + (cond + [(not name) name] + [(symbol? (syntax-e name)) + (symbol->string (syntax-e name))] + [else (syntax-e name)]))) + (values form-name dup-names mode-stx contract rules string-rule-names)) ;; names : (listof (or/c #f syntax[string])) (define-for-syntax (check-dup-rule-names full-stx syn-err-name names) (define tab (make-hash)) (for ([name (in-list names)]) (when (syntax? name) - (define k (syntax-e name)) + (define k (if (symbol? (syntax-e name)) + (symbol->string (syntax-e name)) + (syntax-e name))) (hash-set! tab k (cons name (hash-ref tab k '()))))) (for ([(k names) (in-hash tab)]) (unless (= 1 (length names)) diff --git a/collects/redex/scribblings/ref.scrbl b/collects/redex/scribblings/ref.scrbl index ebd4954a90..be84fb041a 100644 --- a/collects/redex/scribblings/ref.scrbl +++ b/collects/redex/scribblings/ref.scrbl @@ -1161,7 +1161,8 @@ and @racket[#f] otherwise. (side-condition @#,tttterm) (side-condition/hidden @#,tttterm)] [rule-name (code:line) - string] + string + non-ellipsis-non-hypens-var] [pat/term @#,ttpattern @#,tttterm] [maybe-ellipsis (code:line) diff --git a/collects/redex/tests/syn-err-tests/judgment-form-definition.rktd b/collects/redex/tests/syn-err-tests/judgment-form-definition.rktd index b42881b44b..645179d84c 100644 --- a/collects/redex/tests/syn-err-tests/judgment-form-definition.rktd +++ b/collects/redex/tests/syn-err-tests/judgment-form-definition.rktd @@ -68,7 +68,8 @@ (define-judgment-form syn-err-lang #:mode (J I) [(J number) - bad-prem]) + bad-prem + q]) (void))) (#rx"expected judgment form name" ([bad-judgment-form q]) diff --git a/collects/redex/tests/tl-test.rkt b/collects/redex/tests/tl-test.rkt index c51ee87754..51d2b131e0 100644 --- a/collects/redex/tests/tl-test.rkt +++ b/collects/redex/tests/tl-test.rkt @@ -2065,6 +2065,19 @@ (list (term (s (s (s z)))))) (test (judgment-holds (sumi ,'z (s z) (s z))) #t) + (define-judgment-form nats + #:mode (sumi2 I I O) + #:contract (sumi2 n n n) + [------------- sumz ;; symbol name + (sumi2 z n n)] + [(sumi2 n_1 n_2 n_3) + --------------------------- "sumn" ;; string name + (sumi2 (s n_1) n_2 (s n_3))]) + (test (judgment-holds (sumi2 z (s z) n) n) + (list (term (s z)))) + (test (judgment-holds (sumi2 (s (s z)) (s z) n) n) + (list (term (s (s (s z)))))) + (define-judgment-form nats #:mode (sumo O O I) #:contract (sumo n n n) @@ -2201,7 +2214,7 @@ (test (judgment-holds (map-add-some-one (z (s z) (s (s z))) (n ...)) (n ...)) - (list (term ((s z) (s (s z)) (s (s (s z))))))) + (list (term ((s z) (s (s z)) (s (s (s z))))))) (define-judgment-form nats #:mode (hyphens I)