diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2024-06-20 00:11:27 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2024-06-20 00:11:27 -0700 |
commit | 19456350b81fcc95d09468989c34a20fb1ad9bc9 (patch) | |
tree | be03c80bbd89efe58589c78d96dc93a2e935935e | |
parent | 6bd0f5494990a18352de716987460914858d2f82 (diff) | |
download | txr-19456350b81fcc95d09468989c34a20fb1ad9bc9.tar.gz txr-19456350b81fcc95d09468989c34a20fb1ad9bc9.tar.bz2 txr-19456350b81fcc95d09468989c34a20fb1ad9bc9.zip |
combi: fix broken k 0 edge cases for sequences.
* combi.c (rperm, comb, rcomb): In the default
case for generic sequences, check k, like
in the other cases and return the special
case result.
* tests/015/comb.tl: New tests.
-rw-r--r-- | combi.c | 8 | ||||
-rw-r--r-- | tests/015/comb.tl | 10 |
2 files changed, 18 insertions, 0 deletions
@@ -471,6 +471,8 @@ val rperm(val seq, val k) return cons(string(L""), nil); return rperm_str(seq, k); default: + if (zerop(k)) + return cons(make_like(nil, seq), nil); return rperm_seq(seq, k); } } @@ -748,6 +750,10 @@ val comb(val seq, val k) return nil; return comb_hash(seq, k); } + if (k == zero) + return cons(make_like(nil, seq), nil); + if (gt(k, length(seq))) + return nil; return comb_seq(seq, k); } } @@ -879,6 +885,8 @@ val rcomb(val seq, val k) return cons(string(L""), nil); return rcomb_str(seq, k); default: + if (k == zero) + return cons(make_like(nil, seq), nil); return rcomb_seq(seq, k); } } diff --git a/tests/015/comb.tl b/tests/015/comb.tl index 9973e94d..70aa9dd3 100644 --- a/tests/015/comb.tl +++ b/tests/015/comb.tl @@ -441,3 +441,13 @@ (rperm "a".."c" 2) (("a" "a") ("a" "b") ("a" "c") ("b" "a") ("b" "b") ("b" "c") ("c" "a") ("c" "b") ("c" "c"))) + +(mtest + (perm '(1 2 3) 0) (nil) + (rperm '(1 2 3) 0) (nil) + (comb '(1 2 3) 0) (nil) + (rcomb '(1 2 3) 0) (nil) + (perm 1..4 0) (nil) + (rperm 1..4 0) (nil) + (comb 1..4 0) (nil) + (rcomb 1..4 0) (nil)) |