On 9 Feb 2014, at 17:57, Pascal J. Bourguignon <p...@informatimago.com> wrote:

> If you want to allow any kind of keywords for any call to the generic
> function, you can declare it as:
> 
>    (defgeneric foo (a b &key &allow-other-keys))
>    (defmethod foo (a b &key c d &allow-other-keys) (or c d 42))
> 
> or alternatively, if you're concerned only with a single call, you can
> call it as:
> 
>   (foo unknown-object-1 unknown-object-2 :d 3 :allow-other-keys t)

I recommend to be careful with :allow-other-keys t. I recently used it a bit 
too indiscriminately, and this created some problems. The reason was that I 
created a few levels of indirection that looked roughly like this:

(defun foo (a b c &rest args &key k1 k2)
  …
  (apply ‘bar … args)
  …)

If you call (foo 1 2 3 :k3 :allow-other-keys t), this can be handy, but keep in 
mind that the additional keyword parameter is passed down also in &rest args, 
and this may screw up further processing down the lines.

It was possible to resolve this with a more careful definition of the parameter 
lists, and the code is now much cleaner.


Pascal

--
Pascal Costanza
The views expressed in this email are my own, and not those of my employer.




Reply via email to