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/HyperSpec/Body/m_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] )}*] )
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
- 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))