diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/match-expanders.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/match-expanders.rkt index 6d0fbed5..a658ca47 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/match-expanders.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/match-expanders.rkt @@ -19,7 +19,12 @@ (lambda (stx) (syntax-parse stx [(_ elem-pat (~optional var-pat #:defaults ([var-pat #'var]))) - (syntax/loc stx (Mu: var-pat (Union: (list (Value: '()) (Pair: elem-pat (F: var-pat))))))]))) + ;; Note: in practice it's unlikely that the second pattern will ever come up + ;; because the sequence number for '() will be low and the union will + ;; be sorted by sequence number. As a paranoid precaution, however, + ;; we will match against both patterns here. + (syntax/loc stx (or (Mu: var-pat (Union: (list (Value: '()) (Pair: elem-pat (F: var-pat))))) + (Mu: var-pat (Union: (list (Pair: elem-pat (F: var-pat)) (Value: '()))))))]))) (define-match-expander List: (lambda (stx) @@ -40,4 +45,6 @@ (lambda (stx) (syntax-parse stx [(_ elem-pat) - #'(Mu: var (Union: (list (Value: '()) (MPair: elem-pat (F: var)))))]))) + ;; see note above + #'(or (Mu: var (Union: (list (Value: '()) (MPair: elem-pat (F: var))))) + (Mu: var (Union: (list (MPair: elem-pat (F: var)) (Value: '())))))]))) diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/printer.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/printer.rkt index ab2d4f47..07b3f9cb 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/printer.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/printer.rkt @@ -8,6 +8,7 @@ (prefix-in s: srfi/1) (path-up "rep/type-rep.rkt" "rep/filter-rep.rkt" "rep/object-rep.rkt" "rep/rep-utils.rkt" "types/subtype.rkt" + "types/match-expanders.rkt" "utils/utils.rkt" "utils/tc-utils.rkt") (for-syntax racket/base syntax/parse)) @@ -324,13 +325,9 @@ [(App: rator rands stx) (list* (type->sexp rator) (map type->sexp rands))] ;; special cases for lists - [(Mu: var (Union: (list (Value: '()) (Pair: elem-ty (F: var))))) + [(Listof: elem-ty) `(Listof ,(t->s elem-ty))] - [(Mu: var (Union: (list (Pair: elem-ty (F: var)) (Value: '())))) - `(Listof ,(t->s elem-ty))] - [(Mu: var (Union: (list (Value: '()) (MPair: elem-ty (F: var))))) - `(MListof ,(t->s elem-ty))] - [(Mu: var (Union: (list (MPair: elem-ty (F: var)) (Value: '())))) + [(MListof: elem-ty) `(MListof ,(t->s elem-ty))] ;; format as a string to preserve reader abbreviations and primitive ;; values like characters (when `display`ed)