Fix templates of union schemas
This commit is contained in:
parent
7ce9166a5d
commit
507f137c25
|
@ -37,7 +37,7 @@
|
|||
|
||||
(define-syntax (define-preserves-pattern stx)
|
||||
(syntax-case stx ()
|
||||
[(_ (ctor-stx field-stxs ...) pattern-stx bindings-stx)
|
||||
[(_ top-type-name (ctor-stx field-stxs ...) pattern-stx bindings-stx)
|
||||
#`(begin (begin-for-syntax
|
||||
(register-preserves-pattern!
|
||||
#'ctor-stx
|
||||
|
@ -50,7 +50,7 @@
|
|||
['template
|
||||
(syntax-case s ()
|
||||
[(_ field-stxs ...)
|
||||
(syntax (#,(format-id #'ctor-stx "~a->preserves" (syntax-e #'ctor-stx))
|
||||
(syntax (#,(format-id #'ctor-stx "~a->preserves" (syntax-e #'top-type-name))
|
||||
(ctor-stx field-stxs ...)))])]
|
||||
['bindings
|
||||
(syntax-case s ()
|
||||
|
|
|
@ -70,14 +70,14 @@
|
|||
(if (equal? s discard) `() `(',k ,s)))))))]
|
||||
[other (error 'pat-pattern "Unimplemented: ~v" other)]))
|
||||
|
||||
(define (top-pat name p ty k-nonrecord)
|
||||
(define (top-pat top-name name p ty k-nonrecord)
|
||||
(let ((fields (match ty
|
||||
[(ty-unit) '()]
|
||||
[(ty-record fields) (map escape (map car fields))]
|
||||
[_ #f])))
|
||||
(if (not fields)
|
||||
(k-nonrecord)
|
||||
`(define-preserves-pattern (,name ,@fields)
|
||||
`(define-preserves-pattern ,top-name (,name ,@fields)
|
||||
(quasisyntax ,(pat-pattern p))
|
||||
(append ,@(for/list [(f (in-list fields))]
|
||||
`(analyse-pattern-bindings (syntax ,f))))))))
|
||||
|
@ -87,12 +87,15 @@
|
|||
`(begin ,@(for/list [(named-alt (in-list (list* p0 p1 pN)))
|
||||
(alt-ty (in-list (map cadr (ty-union-variants (definition-ty def)))))]
|
||||
(match-define (NamedAlternative variant-label-str pattern) named-alt)
|
||||
(top-pat (format-symbol "~a-~a" name variant-label-str) pattern alt-ty
|
||||
(lambda () `(begin)))))]
|
||||
(define full-name (format-symbol "~a-~a" name variant-label-str))
|
||||
(top-pat name full-name pattern alt-ty
|
||||
(lambda () `(define-preserves-pattern ,name (,full-name value)
|
||||
(analyse-pattern #'value)
|
||||
(analyse-pattern-bindings (syntax value)))))))]
|
||||
[(? Definition-and?)
|
||||
`(begin)]
|
||||
[(Definition-Pattern p)
|
||||
(top-pat name p (definition-ty def) (lambda () `(begin)))]))
|
||||
(top-pat name name p (definition-ty def) (lambda () `(begin)))]))
|
||||
|
||||
(define exprs
|
||||
`((require (prefix-in :pat: ,ds-path))
|
||||
|
|
Loading…
Reference in New Issue