Examples of what you can do.
(defmethod some-fn ((num real))
(print "an integer"))
(defmethod some-fn ((num real))
(print "a real"))
(defmethod some-fn ((num (eql 0)))
(print "zero"))
(some-fn 19323923198319)
"an integer"
(some-fn 19323923198319.3)
"a real"
(some-fn 0)
"zero"
It also works with a general ‘string type.
(defmethod some-fn ((num string))
(print "a string"))
(some-fn "asrt")
"a string"
Not with a specific string, however
(defmethod some-fn ((num (eql "A")))
(print "a specifict string")))
(some-fn "A")
=> "A string"
I imagine it doesn’t work because eql does not work on strings in the way that would be necessary for it to work.
(eql "a" "a") => nil
Is there a way to do it?
Short answer: Yes, it has.
Long answer:
You wrote:
That’s because you got the syntax wrong. It should be:
Which is usually formatted as:
If you format it this way and use the built-in indentation tool of your favorite editor, you would see that the indentation looks wrong for your code:
It also may help to try to understand the error message shown by the compiler.
Back to the topic:
You can use strings as any other Lisp object for EQL dispatch in CLOS.
It is just that there are many possible strings that look like “A” and EQL compares for identity (with an exception for numbers and characters). EQL does not compare strings by their characters.
Typically (EQL “A” “A”) returns NIL. (Side note: Actually in code compiled by the compiler this expression theoretically can be T. Because the compiler is allowed to reuse data objects to save space in the compiled code. Here we have literal strings, data objects.)
If you enter on the command line
it won’t trigger the EQL dispatch.
But this works as expected:
and then
You need to make sure that the variable has a value. The variable is evaluated, when the macro expansion of the DEFMETHOD form is evaluated. The value then is the object that is used for EQL dispatch.
As Dirk has mentioned in his answer, one can use symbols. The purpose of symbols is that (EQL ‘|A| ‘|A|) is usually T. Symbols are made EQ during the reading process.
Summary:
EQL dispatch over strings works in CLOS. For practical use, you need to call the function with the same, in terms of EQL, string.