From: Barry Margolin
Subject: Re: intersection: noncommutative: can be relied upon?
Date:
Message-ID: <622nfh$ogl@tools.bbnplanet.com>
In article <·············@WINTERMUTE.eagle>,
SDS <···········@cctrading.com> wrote:
>Neither CLtL2 nor CLHS specify this:
> (intersection '(a b) '((a . 1) (b . 2) (c . 3)) :test #'eq :key
> (lambda (x) (if (consp x) (car x) x)))
> ==> (a b)
> (intersection '((a . 1) (b . 2) (c . 3)) '(a b) :test #'eq :key
> (lambda (x) (if (consp x) (car x) x)))
> ==> ((a . 1) (b . 2))
>
>Can I assume that intersection takes the elements from the first list?
You can assume that *this* implementation of INTERSECTION takes the
elements from the first list. And you might even be right.
>(It is specified for nintersection, but what about intersection?)
I don't see it specified for NINTERSECTION. It says that it *may* destroy
the first argument. But it doesn't say where it gets the elements from.
So the following could happen:
(setq arg1 (list a b))
(setq arg2 (list '(a . 1) '(b . 2) '(c . 3)))
(setq result (nintersection arg1 arg2)) => ((a . 1) (b . 2))
arg1 => ((a . 1) (b . 2))
(eq (car arg1) (car arg2)) => T
What this possible implementation did was use the list backbone from arg1,
but filled it in with the matching elements from arg2.
>Is intersection the proper tool to extract subsets matching on a key?
>(Like in the second call above, a subset of the alist is extracted).
>Of course, there are many ways to extract subsets, e.g.,
> (mapcon (lambda (x) (if (member (caar x) '(a b)) (list (car x)) nil))
> '((a . 1) (b . 2) (c . 3)))
> ==> ((a . 1) (b . 2))
>What would the gurus think to be "the best way"?
The REMOVE/DELETE family of functions are usually used for this:
(remove '(a b) '((a . 1) (b . 2) (c . 3)) :key #'car
:test #'(lambda (list element) (not (member element list))))
You can't just use :TEST #'MEMBER because the arguments are in the wrong
order.
(remove-if #'(lambda (element) (not (member element '(a b))))
'((a . 1) (b . 2) (c . 3)) :key #'car)
--
Barry Margolin, ······@bbnplanet.com
GTE Internetworking, Powered by BBN, Cambridge, MA
Support the anti-spam movement; see <http://www.cauce.org/>
Please don't send technical questions directly to me, post them to newsgroups.