summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-01-21 01:09:55 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-01-21 01:09:55 -0800
commit6c608b31b9c6a3ff29bf9d21b27e79d82aa253b5 (patch)
tree909345a642e151f0b93b7d7f0f74da41b6892535 /share
parent15cc57607711e8e3de2d97d67d04d72a8d08968b (diff)
downloadtxr-6c608b31b9c6a3ff29bf9d21b27e79d82aa253b5.tar.gz
txr-6c608b31b9c6a3ff29bf9d21b27e79d82aa253b5.tar.bz2
txr-6c608b31b9c6a3ff29bf9d21b27e79d82aa253b5.zip
matcher: cleaner @(let) implementation.
* share/txr/stdlib/match.tl (compile-let-match): Reimplement cleanly in terms of compiling a variable match and a pattern match against the same object and integrating the two. Also, do not reject nil as a variable name; the documentation clearly says it is allowed.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/match.tl23
1 files changed, 11 insertions, 12 deletions
diff --git a/share/txr/stdlib/match.tl b/share/txr/stdlib/match.tl
index 964e82ff..63fa75e1 100644
--- a/share/txr/stdlib/match.tl
+++ b/share/txr/stdlib/match.tl
@@ -203,18 +203,17 @@
match)))
(defun compile-let-match (exp obj-var var-list)
- (mac-param-bind *match-form* (op sym match) exp
- (unless (bindable sym)
- (compile-error *match-form* "~s is not a bindable symbol" sym))
- (let ((match (compile-match match obj-var var-list)))
- (cond
- (var-list.(exists sym)
- (set match.test-expr
- ^(and ,match.test-expr (equal ,sym ,match.obj-var))))
- (t (push sym match.vars)
- (push obj-var match.var-exprs)
- var-list.(record sym)))
- match)))
+ (mac-param-bind *match-form* (op sym pat) exp
+ (let ((var-match (compile-var-match sym obj-var var-list))
+ (pat-match (compile-match pat obj-var var-list)))
+ (new compiled-match
+ pattern exp
+ obj-var obj-var
+ guard-chain (append var-match.guard-chain
+ pat-match.guard-chain)
+ test-expr ^(and ,var-match.test-expr ,pat-match.test-expr)
+ vars (append var-match.vars pat-match.vars)
+ var-exprs (append var-match.var-exprs pat-match.var-exprs)))))
(defun compile-loop-match (exp obj-var var-list)
(mac-param-bind *match-form* (op match) exp