From 58c1642901889829eb55ceea2ae868dea848eab9 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 29 Jan 2021 20:29:18 -0800 Subject: matcher: bugfix: @nil isn't trivial. * share/txr/stdlib/match.tl (non-triv-pat-p): Extend sys:var match so (sys:var nil) is identified as trivial. * tests/011/patmatch.tl: Add broken test case fixed by this. This doesn't show up when @nil is used as the only match. It also doesn't show up if @nil is used in a vector or list in a mixture with other operators, because those other ones identify the overall list pattern as non-trivial. None of the occurrences of @nil in the existing test suite, like (@nil @nil @x) tickle the bug. --- share/txr/stdlib/match.tl | 2 +- tests/011/patmatch.tl | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/share/txr/stdlib/match.tl b/share/txr/stdlib/match.tl index 920ca14e..8c7a4fcf 100644 --- a/share/txr/stdlib/match.tl +++ b/share/txr/stdlib/match.tl @@ -540,7 +540,7 @@ (defun non-triv-pat-p (syntax) (match-case syntax ((@(op eq 'sys:expr) (@(bindable) . @nil)) t) - ((@(op eq 'sys:var) @(bindable) . @nil) t) + ((@(op eq 'sys:var) @(or @(bindable) nil) . @nil) t) ((@pat . @rest) (or (non-triv-pat-p pat) (non-triv-pat-p rest))) (#R(@from @to) (or (non-triv-pat-p from) diff --git a/tests/011/patmatch.tl b/tests/011/patmatch.tl index 6a9c6f18..7768e89b 100644 --- a/tests/011/patmatch.tl +++ b/tests/011/patmatch.tl @@ -9,6 +9,7 @@ (yes no)) (test (when-match @a 42 (list a)) (42)) +(test (when-match (@nil) '(1) 'yes) yes) (test (when-match (@a @b @c) '(1 2 3) (list c b a)) (3 2 1)) (test (if-match (@a @b @c . @d) '(1 2 3 . 4) (list d c b a)) (4 3 2 1)) -- cgit v1.2.3