Simplify printing for list type special cases

original commit: 755998ba8285d313d2bdcbd1fb469c7e6a1c904c
This commit is contained in:
Asumu Takikawa 2014-02-04 16:26:27 -05:00
parent bee2da86df
commit 6c05fedfb8
2 changed files with 12 additions and 8 deletions

View File

@ -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: '())))))])))

View File

@ -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)