summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/match.tl8
-rw-r--r--tests/011/patmatch.tl14
2 files changed, 22 insertions, 0 deletions
diff --git a/share/txr/stdlib/match.tl b/share/txr/stdlib/match.tl
index 2cca5322..514b06c6 100644
--- a/share/txr/stdlib/match.tl
+++ b/share/txr/stdlib/match.tl
@@ -921,6 +921,14 @@
(quasi-match vlist rest (cons sym vars) str npos))))
;; `@var0@var1` (unbound followed by bound)
(((@(eq 'sys:var) @sym)
+ @(as bvar (@(eq 'sys:var) @(bound-p vlist vars @bsym) . @mods)))
+ (with-gensyms (txt end)
+ (list ^@(with ,txt (sys:quasi ,bvar))
+ ^@(require @(with ,end (search-str ,str ,txt ,pos))
+ ,end (eql (+ , end (len ,txt)) (len ,str)))
+ ^@(with ,sym (sub-str ,str ,pos ,end)))))
+ ;; `@var0@var1...` (unbound followed by bound)
+ (((@(eq 'sys:var) @sym)
@(as bvar (@(eq 'sys:var) @(bound-p vlist vars @bsym) . @mods))
. @rest)
(with-gensyms (txt end npos)
diff --git a/tests/011/patmatch.tl b/tests/011/patmatch.tl
index c40d5ea5..e9685b87 100644
--- a/tests/011/patmatch.tl
+++ b/tests/011/patmatch.tl
@@ -350,10 +350,24 @@
(test (when-match `#@a-$` "#a-$" a) "a")
(test (when-match `#@a-$` "#a-$$" a) nil)
(test (when-match `#@a-$` "#a-" a) nil)
+(test (when-match `#@a-@b` "#a-$" (list a b)) ("a" "$"))
(test (when-match `#@{a #/ab*c/}` "#abbbc" a) "abbbc")
(test (when-match `#@{a #/ab*c/}d` "#abbbcd" a) "abbbc")
(test (when-match `#@{a 3}@b` "#abb" a) "abb")
(test (when-match `#@{a 3}@b` "#abbbc" (list a b)) ("abb" "bc"))
+(test (when-match `#@{a 4}@b` "#abb" a) nil)
+(test (when-match `#@{a 3}` "#abb" a) "abb")
+(test (when-match `#@{a 2}` "#abb" a) nil)
+(test (when-match `#@{a 4}` "#abb" a) nil)
+
+(macro-time-let ((*stderr* *stdnull*))
+ (test (when-match `#@{a 4 5}` "#abb" a) :error))
+
+(let ((b "bcd"))
+ (test (when-match `@a@b` "abcd" a) "a")
+ (test (when-match `@a@{b [1..:]}` "acd" a) "a")
+ (test (when-match `@a@{b [1..:]}` "abcd" a) "ab")
+ (test (when-match `@a@{b [0..1]}` "abcd" a) nil))
(compile-only
(eval-only