summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kazkylheku@vtech.ca>2021-01-18 19:59:36 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-01-18 19:59:36 -0800
commita91aff6dfa0d97c4130a3a7c630466b8ec2e247b (patch)
tree339b4109213548307cb780bc6e2f6119ee4f139d /share
parent1e081d603a1bf43b8a63d559a00aebb82a5bdb20 (diff)
downloadtxr-a91aff6dfa0d97c4130a3a7c630466b8ec2e247b.tar.gz
txr-a91aff6dfa0d97c4130a3a7c630466b8ec2e247b.tar.bz2
txr-a91aff6dfa0d97c4130a3a7c630466b8ec2e247b.zip
matcher: add @(not) operator.
* share/txr/stdlib/match.tl (compile-not-match): New function. (compile-match): Hook in not operator. * txr.1: Documented.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/match.tl17
1 files changed, 17 insertions, 0 deletions
diff --git a/share/txr/stdlib/match.tl b/share/txr/stdlib/match.tl
index 5c6038f5..38145218 100644
--- a/share/txr/stdlib/match.tl
+++ b/share/txr/stdlib/match.tl
@@ -262,6 +262,22 @@
test-expr t
vars (uniq (mappend .vars par-matches))))))))
+(defun compile-not-match (pattern obj-var)
+ (tree-bind (op pattern) pattern
+ (let* ((pm (compile-match pattern obj-var))
+ (guard (new match-guard
+ guard-expr ^(not (let ,pm.(get-vars)
+ ,pm.(wrap-guards
+ ^(progn ,*pm.(assignments)
+ (when ,pm.test-expr
+ t))))))))
+ (new compiled-match
+ pattern pattern
+ obj-var obj-var
+ guard-chain (list guard)
+ test-expr t
+ vars nil))))
+
(defun compile-match (pat : (obj-var (gensym)))
(cond
((consp pat)
@@ -278,6 +294,7 @@
(some (compile-loop-match exp obj-var))
(or (compile-parallel-match exp obj-var))
(and (compile-parallel-match exp obj-var))
+ (not (compile-not-match exp obj-var))
(op (compile-op-match exp obj-var))
(t (compile-predicate-match exp obj-var)))
(compile-error *match-form*