diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-01-15 07:12:15 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-01-15 07:12:15 -0800 |
commit | 7667fc940e6ee797770ba966d4d6df74a1e6a4e6 (patch) | |
tree | cff3c075a3b2055b82d14336e120d8b3db26d3c5 /share | |
parent | 68ac0d194820fe9091fb4720b74ed1782767daee (diff) | |
download | txr-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.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/match.tl | 7 |
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) |