diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-03-20 19:15:16 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-03-20 19:15:16 -0700 |
commit | 21895771fb5453aa48bfbefb7345a6b906f4a8f3 (patch) | |
tree | 6c659f4ff5d0acc1ea3ca65847604e7053614050 /lib.c | |
parent | 910bfe70001096784fdd008db12e8f27503f590d (diff) | |
download | txr-21895771fb5453aa48bfbefb7345a6b906f4a8f3.tar.gz txr-21895771fb5453aa48bfbefb7345a6b906f4a8f3.tar.bz2 txr-21895771fb5453aa48bfbefb7345a6b906f4a8f3.zip |
lib: new ldiff function.
* eval.c (eval_init): Use the old ldiff function under
compatibility with 190 or lower.
* lib.c (ldiff): Rewritten.
(ldiff_old): New function, copy of previous version of ldiff.
* lib.h (ldiff_old): Declared.
Diffstat (limited to 'lib.c')
-rw-r--r-- | lib.c | 57 |
1 files changed, 56 insertions, 1 deletions
@@ -1447,7 +1447,62 @@ val lazy_appendl(val lists) return lazy_appendv(args); } -val ldiff(val list1, val list2) +val ldiff(val seq1_in, val seq2) +{ + val seq1 = seq1_in; + list_collect_decl (out, ptail); + +loop: + if (seq1 == seq2) + return out; + + { + seq_info_t si1 = seq_info(seq1); + seq_info_t si2 = seq_info(seq2); + + switch (SEQ_KIND_PAIR(si1.kind, si2.kind)) { + case SEQ_KIND_PAIR(SEQ_NIL, SEQ_NIL): + case SEQ_KIND_PAIR(SEQ_NIL, SEQ_LISTLIKE): + case SEQ_KIND_PAIR(SEQ_NIL, SEQ_VECLIKE): + case SEQ_KIND_PAIR(SEQ_NIL, SEQ_HASHLIKE): + case SEQ_KIND_PAIR(SEQ_NIL, SEQ_NOTSEQ): + break; + case SEQ_KIND_PAIR(SEQ_LISTLIKE, SEQ_NIL): + case SEQ_KIND_PAIR(SEQ_VECLIKE, SEQ_NIL): + case SEQ_KIND_PAIR(SEQ_HASHLIKE, SEQ_NIL): + case SEQ_KIND_PAIR(SEQ_NOTSEQ, SEQ_NIL): + return seq1; + case SEQ_KIND_PAIR(SEQ_LISTLIKE, SEQ_LISTLIKE): + ptail = list_collect(ptail, car(si1.obj)); + seq1 = cdr(si1.obj); + goto loop; + case SEQ_KIND_PAIR(SEQ_LISTLIKE, SEQ_VECLIKE): + case SEQ_KIND_PAIR(SEQ_LISTLIKE, SEQ_HASHLIKE): + case SEQ_KIND_PAIR(SEQ_LISTLIKE, SEQ_NOTSEQ): + ptail = list_collect(ptail, car(si1.obj)); + seq1 = cdr(si1.obj); + goto loop; + case SEQ_KIND_PAIR(SEQ_VECLIKE, SEQ_VECLIKE): + if (equal(seq1, seq2) || zerop(length(seq1))) + break; + ptail = list_collect(ptail, ref(seq1, zero)); + seq1 = sub(seq1, one, t); + goto loop; + case SEQ_KIND_PAIR(SEQ_HASHLIKE, SEQ_HASHLIKE): + case SEQ_KIND_PAIR(SEQ_NOTSEQ, SEQ_NOTSEQ): + if (!equal(seq1, seq2)) + ptail = list_collect_append(ptail, seq1); + break; + default: + ptail = list_collect_append(ptail, seq1); + break; + } + } + + return make_like(out, seq1_in); +} + +val ldiff_old(val list1, val list2) { val list_orig = list1; list_collect_decl (out, ptail); |