summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-01-15 07:12:15 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-01-15 07:12:15 -0800
commite4b0eba5b266b2510bd358fdeff48f6100f2d211 (patch)
treecff3c075a3b2055b82d14336e120d8b3db26d3c5
parentb7ff83e5a61175a97c6979ea51776d0b2b32d0ce (diff)
downloadtxr-e4b0eba5b266b2510bd358fdeff48f6100f2d211.tar.gz
txr-e4b0eba5b266b2510bd358fdeff48f6100f2d211.tar.bz2
txr-e4b0eba5b266b2510bd358fdeff48f6100f2d211.zip
matcher: use flag to eliminate block.
* share/txr/stdlib/match.tl (compile-all-match): We use a flag to break out of the loop instead of (return). The loop's block is thereby later eliminated by the compiler. For this we re-purpose the same all-match-p-var symbol.
-rw-r--r--share/txr/stdlib/match.tl7
1 files changed, 4 insertions, 3 deletions
diff --git a/share/txr/stdlib/match.tl b/share/txr/stdlib/match.tl
index dd917786..74026980 100644
--- a/share/txr/stdlib/match.tl
+++ b/share/txr/stdlib/match.tl
@@ -170,8 +170,9 @@
(matched-p-var (gensym "matched-p-"))
(iter-var (gensym "iter-"))
(collect-vars [mapcar gensym cm.vars])
- (loop ^(for ((,iter-var ,obj-var))
- (,iter-var t)
+ (loop ^(for ((,iter-var ,obj-var)
+ (,all-match-p-var t))
+ ((and ,all-match-p-var ,iter-var) ,all-match-p-var)
((set ,iter-var (cdr ,iter-var)))
(let ((,cm.obj-var (car ,iter-var))
,matched-p-var
@@ -185,7 +186,7 @@
cm.vars
collect-vars)))))
(unless ,matched-p-var
- (return nil)))))
+ (set ,all-match-p-var nil)))))
(guard (new match-guard
vars (cons all-match-p-var collect-vars)
var-exprs (list loop)