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