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
commit7667fc940e6ee797770ba966d4d6df74a1e6a4e6 (patch)
treecff3c075a3b2055b82d14336e120d8b3db26d3c5
parent68ac0d194820fe9091fb4720b74ed1782767daee (diff)
downloadtxr-7667fc940e6ee797770ba966d4d6df74a1e6a4e6.tar.gz
txr-7667fc940e6ee797770ba966d4d6df74a1e6a4e6.tar.bz2
txr-7667fc940e6ee797770ba966d4d6df74a1e6a4e6.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)