> From: Steve Haflich <franz.com at smh>
>
> From: Stefan Landvogt <nichimen.com at stefan>
>
> I have the following methods
>
> (defmethod foo (arg))
> (defmethod foo ((arg integer)))
> (defmethod foo ((what (eql :bar))))
>
> USER(58): (find-method #'foo '() `( (eql :bla)))
> Error: The generic function #<STANDARD-GENERIC-FUNCTION FOO> does not
> have a method
> with qualifiers NIL specializers ((EQL :BLA))
> [condition type: PROGRAM-ERROR]
> [1] USER(59):
>
> What is the right thing to do here?
>
> Two problems:
>
> First, you misspelled :BAR as :BLA, but even after correcting that it
> still won't work. Manipulation of EQL specializers is not covered in
> the ANS but is specified in the AMOP (see Appendix B in the ACL User
> Guide).
>
> The third argument to FIND-METHOD is a list of CLOS:SPECIALIZER
> objects. A CLASS is a CLOS:SPECIALIZER, and so is a
> CLOS:EQL-SPECIALIZER. You obtain a CLOS:EQL-SPECIALIZER for an object
> with the function CLOS:INTERN-EQL-SPECIALIZER.
>
> USER(7): (find-method #'foo () (list (clos:intern-eql-specializer :bar)))
> #<STANDARD-METHOD FOO ((EQL :BAR))>
The simpler original form, (find-method #'foo '() (list '(eql :bar)))
[typo fixed] works fine in Macintosh Common Lisp, and
intern-eql-specializer is unknown in MCL. This unfortunately just means
one more conditional compilation switch for those of us trying to write
cross-platform code. Could find-method be patched in ACL to work the
simpler way?
Shannon Spires
<sandia.gov at svspire>