From: Scott L. B. <Sc...@sy...> - 2008-04-27 20:25:40
|
Quoting Brian Mastenbrook <br...@ma...>: > On Apr 27, 2008, at 2:45 PM, Mikael Lax wrote: > >> Hi all, >> >> the following code: >> >> ((lambda (x y) >> (adjoin x y :key #'first :test #'string=)) >> '("B") '(("A"))) >> >> gives [an error] > > The very first thing it does is to pass the list ("B") to STRING=. Oh, interesting. I see in CLHS section 17.2.1 that "The function designated by the `:key' argument is never called on O itself" (where "O" here refers to the first argument to `adjoin'). For some of the other routines to which this applies, such as `member', this could make sense; but the consequence is that for `adjoin' (and similarly `pushnew'), `:key' is useless, since the resulting list will no longer have a consistent type. Instead you'll have to write (adjoin x y :test (lambda (x y) (string= (first x) (first y)))) which you might think would mean the same thing, but doesn't. A little unfortunate. -- Scott |