summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/match.tl32
1 files changed, 11 insertions, 21 deletions
diff --git a/share/txr/stdlib/match.tl b/share/txr/stdlib/match.tl
index 5105bd2e..920ca14e 100644
--- a/share/txr/stdlib/match.tl
+++ b/share/txr/stdlib/match.tl
@@ -52,10 +52,16 @@
guard-chain
(:method get-vars (me)
- (get-guard-values me.guard-chain .vars))
-
- (:method get-var-exprs (me)
- (get-guard-values me.guard-chain .var-exprs))
+ (labels ((getv (gc)
+ (append-each ((g gc))
+ (typecase g
+ (match-guard
+ g.vars)
+ (guard-disjunction
+ (append-each ((gc g.guard-chains)) (getv gc)))
+ (t (compile-error *match-form*
+ "internal error: bad guard ~s" g))))))
+ (uniq (getv me.guard-chain))))
(:method wrap-guards (me . forms)
(labels ((wrg (rgc exp)
@@ -115,16 +121,6 @@
(:method exists (me sym) (member sym me.vars))
(:method record (me sym) (push sym me.vars)))
-(defun get-guard-values (guard-chain fun)
- (append-each ((g guard-chain))
- (typecase g
- (match-guard
- [fun g])
- (guard-disjunction
- (append-each ((gc g.guard-chains))
- (get-guard-values gc fun)))
- (t (compile-error *match-form* "internal error: bad guard ~s" g)))))
-
(defun compile-struct-match (struct-pat obj-var var-list)
(mac-param-bind *match-form* (op required-type . pairs) struct-pat
(let* ((loose-p (not (bindable required-type)))
@@ -377,19 +373,13 @@
(let* ((var-lists (mapcar (ret (copy var-list)) pats))
(par-matches (mapcar (op compile-match @1 obj-var @2)
pats var-lists))
- (all-var-exprs [unique [mapcar cons
- (mappend .(get-vars) par-matches)
- (mappend .(get-var-exprs) par-matches)]
- car])
- (guard (new match-guard
- vars [mapcar car all-var-exprs]))
(dj-guard (new guard-disjunction
guard-chains (mapcar .guard-chain par-matches)
sub-patterns par-matches)))
(new compiled-match
pattern par-pat
obj-var obj-var
- guard-chain (list guard dj-guard)))))
+ guard-chain (list dj-guard)))))
(defun compile-and-match (par-pat obj-var var-list)
(mac-param-bind *match-form* (op . pats) par-pat