diff --git a/module/ice-9/match.upstream.scm b/module/ice-9/match.upstream.scm index 4609883d2..e32ba85fc 100644 --- a/module/ice-9/match.upstream.scm +++ b/module/ice-9/match.upstream.scm @@ -280,14 +280,19 @@ ;; clauses. `g+s' is a list of two elements, the get! and set! ;; expressions respectively. +(define (match-error v) + (error 'match "no matching pattern" v)) + (define-syntax match-next (syntax-rules (=>) ;; no more clauses, the match failed ((match-next v g+s) - ;; Here we wrap error within a double set of parentheses, so that - ;; the call to 'error' won't be in tail position. This allows the - ;; backtrace to show the source location of the failing match form. - ((error 'match "no matching pattern" v))) + ;; Here we call match-error in non-tail context, so that the + ;; backtrace can show the source location of the failing match + ;; form. + (begin + (match-error v) + #f)) ;; named failure continuation ((match-next v g+s (pat (=> failure) . body) . rest) (let ((failure (lambda () (match-next v g+s . rest))))