summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/match.tl20
1 files changed, 13 insertions, 7 deletions
diff --git a/share/txr/stdlib/match.tl b/share/txr/stdlib/match.tl
index 8873062b..8268f0a7 100644
--- a/share/txr/stdlib/match.tl
+++ b/share/txr/stdlib/match.tl
@@ -152,12 +152,16 @@
var-exprs (mappend .var-exprs elem-matches))))
(defun compile-atom-match (atom obj-var var-list)
- (typecase atom
- (vec (compile-vec-match atom obj-var var-list))
- (t (new compiled-match
- pattern atom
- obj-var obj-var
- test-expr ^(equal ,obj-var ',atom)))))
+ (flet ((compile-as-atom ()
+ (new compiled-match
+ pattern atom
+ obj-var obj-var
+ test-expr ^(equal ,obj-var ',atom))))
+ (typecase atom
+ (vec (if (non-triv-pat-p atom)
+ (compile-vec-match atom obj-var var-list)
+ (compile-as-atom)))
+ (t (compile-as-atom)))))
(defun compile-op-match (op-expr obj-var var-list)
(let ((var-match (compile-var-match nil obj-var var-list)))
@@ -399,7 +403,9 @@
(compile-error *match-form*
"unrecognized pattern syntax ~s" pat))))
(sys:var (compile-var-match (cadr pat) obj-var var-list))
- (t (compile-cons-structure pat obj-var var-list))))
+ (t (if (non-triv-pat-p pat)
+ (compile-cons-structure pat obj-var var-list)
+ (compile-atom-match pat obj-var var-list)))))
(t (compile-atom-match pat obj-var var-list))))
(defmacro when-match (:form *match-form* pat obj . body)