1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

Failed match errors generate less code

* module/ice-9/match.upstream.scm (match-next): Call out to an external
  procedure on error, and use a begin instead of double-parens.  This
  results in less generated code.
This commit is contained in:
Andy Wingo 2013-11-01 13:37:27 +01:00
parent 58dee5b9e4
commit 4a565538bd

View file

@ -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))))