<div dir="ltr">It is useful to understand, first, that the rules for keyword arguments accepted by generic functions are rather different and more complex than for non-generic functions, and second, why this is so.<div><br>

</div><div>A non-generic function is defined in one place, e.g. with a singe defun form, and its keyword processing can be determined from that single form.  This remains true even if the function is redefined during run time.</div>

<div><br></div><div>A generic function is different in that it is (usually) specified by numerous defgeneric and defmethod and defclass forms.  (All of these can add methods to a gf!)  And methods can also be added and deleted programatically at run time.  The intention of the rules is that the gf should accept a keyword arg iff there is a method willing to deal with it, and (very important) such a keyword arg should _not_ bother any method _not_ prepared to deal with it.</div>
<div><br></div><div>That's one reason why responsibility for keyword arg checking is placed upon the gf, and not upon individual method functions.</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Feb 9, 2014 at 1:10 AM, Didier Verna <span dir="ltr"><<a href="mailto:didier@lrde.epita.fr" target="_blank">didier@lrde.epita.fr</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">Jean-Claude Beaudoin <<a href="mailto:jean.claude.beaudoin@gmail.com">jean.claude.beaudoin@gmail.com</a>> wrote:<br>

<br>
> Hello CL Pros,<br>
><br>
> I am trying to understand the meaning in conforming ANSI CL<br>
> of the following code snippet and I am not quite sure what to think of it:<br>
><br>
> (defgeneric foo (a b &key))<br>
><br>
> (defmethod foo (a b &key c d) (or c d 42))<br>
><br>
> At this point should a call to foo accept any keyword<br>
> argument, no keyword argument or only :c and/or :d?<br>
> What would be the outcome of this:<br>
><br>
> (foo 1 2 :d 3)<br>
><br>
> Is it an error being signaled or the value 3 being returned?<br>
> I am inclined to believe that an error should be signaled,<br>
> since the generic function lambda-list contains no<br>
> explicit keyword argument and no &allow-other-keys.<br>
<br>
</div>I think that's the opposite. From CLHS:<br>
<br>
| 7.6.5 Keyword Arguments in Generic Functions and Methods<br>
|<br>
| When a generic function or any of its methods mentions &key in a lambda<br>
| list, the specific set of keyword arguments accepted by the generic<br>
| function varies according to the applicable methods. The set of keyword<br>
| arguments accepted by the generic function for a particular call is the<br>
| union of the keyword arguments accepted by all applicable methods and<br>
| the keyword arguments mentioned after &key in the generic function<br>
| definition, if any.<br>
<br>
So because your method accepts :c and :d, then this particular call to<br>
foo does as well. The critical thing to understand here is that the<br>
valid keyword arguments may vary from one call to another.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Please help crowdfund my next Jazz quartet album !!<br>
<a href="http://www.kisskissbankbank.com/quartet-the-second-album" target="_blank">http://www.kisskissbankbank.com/quartet-the-second-album</a><br>
<br>
Lisp, Jazz, Aïkido: <a href="http://www.didierverna.info" target="_blank">http://www.didierverna.info</a><br>
<br>
</font></span></blockquote></div><br></div>