This is a read-only archive of lispforum.com. The forum was locked to new users and posts and is preserved here as static HTML from a database snapshot taken on 2019-09-07.

Optional and keyword parameters in generic functions

3 posts · 2818 views

Is it possible to specialize and give a default value for an optional parameter in a generic function, i.e:

(defgeneric foo (one &optional two))

(defmethod foo ((one number) &optional (two number))
(+ one two))

This is read as though the optional parameter has a default value of number instead of specializing on the type number. I may be missing something obvious but
any help or a pointer to where this has been discussed would be greatly appreciated.

Thanks!

Re: Optional and keyword parameters in generic functions

You can not specialize the optional parameters in generic functions. It would horribly complicate the CLOS type dispatch algorithm and could only reasonably apply in the case of a tie on the main parameters.

Here's an extract from the CLHS page for defmethod. http://www.lispworks.com/documentation/ ... defmet.htm
specialized-lambda-list::= ({var | (var parameter-specializer-name)}* 
                            [&optional {var | (var [initform [supplied-p-parameter] ])}*] 
                            [&rest var] 
                            [&key{var | ({var | (keywordvar)} [initform [supplied-p-parameter] ])}*
                                 [&allow-other-keys] ] 
                            [&aux {var | (var [initform] )}*] )
Notice the difference in the lambda lists for a normal var versus those for &optional, &key, and &aux. Only the required variables can have specializers.

If you really need this secondary dispatch, how about defining another generic function?

Something like
(defgeneric foo-helper (one two) "secondary dispatch for calls to FOO with two args")
(defmethod foo-helper ((one number) (two number))
  (+ one two))
(defmethod foo ((one number) &optional two)
  (foo-helper one two))

Re: Optional and keyword parameters in generic functions

Thanks for straightening that out for me. I will just define another function but wanted to see if this was a possibility.