From 56ea9f8b9a7f476ae5fed613d671daf1c6e41dd0 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Wed, 29 Apr 2015 22:17:24 -0700 Subject: [PATCH] Specify names of missing fields for match on structs --- racket/collects/racket/match/parse-helper.rkt | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/racket/collects/racket/match/parse-helper.rkt b/racket/collects/racket/match/parse-helper.rkt index 3b5508f870..feaaf5ebf9 100644 --- a/racket/collects/racket/match/parse-helper.rkt +++ b/racket/collects/racket/match/parse-helper.rkt @@ -125,13 +125,32 @@ => (lambda (ps) (unless (= (length ps) (length acc)) - (raise-syntax-error - 'match - (format "~a structure ~a: expected ~a but got ~a" - "wrong number for fields for" - (syntax->datum struct-name) (length acc) - (length ps)) - stx pats)) + (when (< (length acc) (length ps)) + (raise-syntax-error + 'match + (format "~a structure ~a: expected ~a but got ~a" + "excess number of fields for" + (syntax->datum struct-name) (length acc) + (length ps)) + stx pats)) + (when (> (length acc) (length ps)) + (raise-syntax-error + 'match + (format + "~a structure ~a: expected ~a but got ~a; ~a ~a" + "insufficient number of fields for" + (syntax->datum struct-name) (length acc) + (length ps) + "missing fields" + (list-tail + (map (lambda (field) + (string->symbol + (substring (symbol->string (syntax->datum field)) + (add1 (string-length + (symbol->string (syntax->datum struct-name))))))) + acc) + (length ps))) + stx pats))) (map parse ps))] [else (raise-syntax-error 'match