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!
Optional and keyword parameters in generic functions
-
- Posts: 16
- Joined: Fri Oct 17, 2008 12:27 pm
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
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
Here's an extract from the CLHS page for defmethod. http://www.lispworks.com/documentation/ ... defmet.htm
Code: Select all
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] )}*] )
If you really need this secondary dispatch, how about defining another generic function?
Something like
Code: Select all
(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))
-
- Posts: 16
- Joined: Fri Oct 17, 2008 12:27 pm
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.