Short answer: Yes, it has.
Long answer:
You wrote:
(defmethod some-fn ((num (eql "A")) (print "a specifict string")))
=> doesn't compile
That's because you got the syntax wrong. It should be:
(defmethod some-fn ((num (eql "A"))) (print "a specific string"))
=> does compile
Which is usually formatted as:
(defmethod some-fn ((num (eql "A")))
(print "a specifict string"))
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:
(defmethod some-fn ((num (eql "A"))
(print "a specifict string")))
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
(some-fn "A")
it won't trigger the EQL dispatch.
But this works as expected:
(defparameter *a-string* "A")
(defmethod some-fn ((num (eql *a-string*)))
(print "a specific string")))
and then
(some-fn *a-string*)
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.