(module check-syntax mzscheme
(provide <record-case> <clause>)
(define (<record-case> stx) (syntax-case stx (else)
[(_ e0 c0 c1 ...)
(for-each (lambda (c) (<clause> stx c)) (syntax->list #'(c0 c1 ...)))]
[(_ e0 c0 c1 ... (else e1))
(for-each (lambda (c) (<clause> stx c)) (syntax->list #'(c0 c1 ...)))]
[_ (raise-syntax-error 'record-case "bad syntax" stx)]))
(define (<clause> ctxt stx) (syntax-case stx (else)
[(else e0 e1 ...) (void)]
[(n (x ...) e0 e1 ...) (begin
(for-each (lambda (e) (<identifier> ctxt e)) (syntax->list #'(n x ...)))
(when (check-duplicate-identifier (syntax->list #'(x ...)))
(raise-syntax-error 'record-case "duplicate identifier"
ctxt #'(x ...))))]
[(n (x ... . y) e0 e1 ...)
(with-syntax ([y (syntax-case #'y ()
[() #'()]
[y #'(y)])])
(for-each (lambda (e) (<identifier> ctxt e)) (syntax->list #'(n x ... . y)))
(when (check-duplicate-identifier (syntax->list #'(x ... . y)))
(raise-syntax-error 'record-case "duplicate identifier"
ctxt #'(x ... . y))))]
[_ (raise-syntax-error 'record-case "bad clause" ctxt stx)]))
(define (<identifier> ctxt stx)
(unless (identifier? stx)
(raise-syntax-error 'record-case "expected identifier" ctxt stx)))
)