[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Some open issues

     Another open issue is that initargs you have to pass to make-instance
     when making a standard-method.  I think the best bet is that in addition
     to the initargs already documented, you must pass :lambda-list, which
     is a lambda-list from which the implementation is permitted to derive
     the number of required and optional arguments, the presence of rest/key
     arguments, the keyword names, for lambda-list congruence computation.
     An implementation is also permitted to ignore the :lambda-list argument
     and get this information from the :function argument, if in that
     implementation a lambda-list can be retrieved from a function (CLtL
     doesn't require that).  I think the lambda-list can be anything that
     meets these requirements, so it can be the specialized-lambda-list that
     appears in the defmethod form, or it can be an ordinary function lambda
     list, or it can be the type of stripped down lambda-list that can
     be used with defgeneric.  I think it's better for the derivation of
     lambda-list congruence information from lambda-lists to be in the system,
     rather than being reimplemented by every user, hence I suggest a lot
     of freedom in what kind of lambda-list the initarg can accept.  The
     alternative would be to require the user to pass two numbers, a boolean,
     and a list of keyword names, but I'd rather not do it that way.

That sounds good. 

I have another related question. We said at the Palo Alto meeting (If I
remember correctly) that something like 

(defmethod foo ((a c1) (b c2) &key x )

would result into a method which lambda list is ((a c1) (b c2) &key x)
(used for the lambda-list congruence computation),
and a function which lambda list can be (a b &key x &allow-other-keys).
It is done so because the generic function check the keywords arguments,
not the method.
If what I said is correct, the question is: When do we change/generate the
function's lambda list?  Do we generate the final one during the
macroexpansion of DEFMETHOD or do we change the lambda-list during the
execution of (make-instance 'standard-method ...)?