diff options
-rw-r--r-- | eval.c | 1 | ||||
-rw-r--r-- | lib.c | 32 | ||||
-rw-r--r-- | lib.h | 1 | ||||
-rw-r--r-- | stdlib/compiler.tl | 4 | ||||
-rw-r--r-- | stdlib/doc-syms.tl | 9 | ||||
-rw-r--r-- | txr.1 | 12 |
6 files changed, 52 insertions, 7 deletions
@@ -7350,6 +7350,7 @@ void eval_init(void) reg_fun(intern(lit("diff"), user_package), func_n4o(diff, 2)); reg_fun(intern(lit("symdiff"), user_package), func_n4o(symdiff, 2)); reg_fun(intern(lit("isec"), user_package), func_n4o(isec, 2)); + reg_fun(intern(lit("isecp"), user_package), func_n4o(isecp, 2)); reg_fun(intern(lit("uni"), user_package), func_n4o(uni, 2)); reg_fun(intern(lit("seqp"), user_package), func_n1(seqp)); @@ -12186,6 +12186,38 @@ val isec(val seq1, val seq2, val testfun, val keyfun) return make_like(out, seq1); } +val isecp(val seq1, val seq2, val testfun, val keyfun) +{ + val self = lit("isecp"); + val out = nil; + seq_iter_t si1, si2; + val el1; + + testfun = default_arg(testfun, equal_f); + keyfun = default_arg(keyfun, identity_f); + + seq_iter_init(self, &si1, seq1); + seq_iter_init_with_rewind(self, &si2, seq2); + + while (seq_get(&si1, &el1)) { + val el1_key = funcall1(keyfun, el1); + val el2; + + seq_iter_rewind(&si2, self); + + while (seq_get(&si2, &el2)) { + val el2_key = funcall1(keyfun, el2); + + if (funcall2(testfun, el1_key, el2_key)) { + out = t; + break; + } + } + } + + return out; +} + val uni(val seq1, val seq2, val testfun, val keyfun) { val self = lit("uni"); @@ -1233,6 +1233,7 @@ val set_diff(val list1, val list2, val testfun, val keyfun); val diff(val seq1, val seq2, val testfun, val keyfun); val symdiff(val seq1, val seq2, val testfun, val keyfun); val isec(val list1, val list2, val testfun, val keyfun); +val isecp(val list1, val list2, val testfun, val keyfun); val uni(val list1, val list2, val testfun, val keyfun); val copy(val seq); val length(val seq); diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl index 7d9cb515..63ceb519 100644 --- a/stdlib/compiler.tl +++ b/stdlib/compiler.tl @@ -2037,7 +2037,7 @@ (al-val (gensym)) (shadow-p (let ((all-vars (append pars.req pars.(opt-syms) (if pars.rest (list pars.rest))))) - (or (isec all-vars fix-arg-iter) + (or (isecp all-vars fix-arg-iter) (member apply-list-expr all-vars))))) ^(,(if shadow-p 'let 'alet) ,(zip fix-vals fix-arg-iter) (let* ,(build @@ -2406,7 +2406,7 @@ self obj))))) (symvec (sys:vm-desc-symvec vm-desc))) out.(add (list-from-vm-desc vm-desc)) - (when (isec symvec %package-manip%) + (when (isecp symvec %package-manip%) out.(add :fence))))) (dump-to-tlo out-stream out)))) diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl index 5ce5c0d0..53d01739 100644 --- a/stdlib/doc-syms.tl +++ b/stdlib/doc-syms.tl @@ -479,7 +479,7 @@ ("delete-package" "N-02E687F3") ("derived" "N-0151798B") ("dev-t" "N-01153D9E") - ("diff" "N-0385B074") + ("diff" "N-00DFDE76") ("digits" "N-03CC559E") ("digpow" "N-030C5561") ("dir-name" "N-02C01721") @@ -1037,7 +1037,8 @@ ("ipv6-v6only" "N-001E8B40") ("iread" "N-03FE5500") ("isatty" "N-03709E8A") - ("isec" "N-0385B074") + ("isec" "N-00DFDE76") + ("isecp" "N-00DFDE76") ("isig" "N-0072FF5E") ("isqrt" "D-0038") ("istrip" "N-02391683") @@ -1920,7 +1921,7 @@ ("symbol-package" "N-02AB2428") ("symbol-value" "N-00004DDC") ("symbolp" "N-01C0BF69") - ("symdiff" "N-0385B074") + ("symdiff" "N-00DFDE76") ("symlink" "N-009EF0C8") ("sys:abscond*" "N-02DF20E5") ("sys:abscond-from" "N-02E20FE2") @@ -2084,7 +2085,7 @@ ("uname" "N-0308D954") ("unget-byte" "D-0007") ("unget-char" "D-0055") - ("uni" "N-0385B074") + ("uni" "N-00DFDE76") ("unintern" "N-01B6BFC2") ("union" "N-01C78B86") ("union-get" "N-02FA4F0C") @@ -35442,10 +35442,11 @@ function, these functions behave the same as and .codn find-min . -.coNP Functions @, uni @, isec @ diff and @ symdiff +.coNP Functions @, uni @, isec @, isecp @ diff and @ symdiff .synb .mets (uni < iter1 < iter1 >> [ testfun <> [ keyfun ]]) .mets (isec < iter1 < iter1 >> [ testfun <> [ keyfun ]]) +.mets (isecp < iter1 < iter1 >> [ testfun <> [ keyfun ]]) .mets (diff < iter1 < iter1 >> [ testfun <> [ keyfun ]]) .mets (symdiff < iter1 < iter2 >> [ testfun <> [ keyfun ]]) .syne @@ -35469,6 +35470,15 @@ and .metn iter2 , returning a new sequence. +The +.code isecp +is Boolean: it returns +.code t +for those arguments for which +.code isec +returns a non-empty list, otherwise +.codn nil . + The arguments .meta iter1 and |