Krótka odpowiedź: Tak , to ma.
Długa odpowiedź:
Napisałeś:
(defmethod some-fn ((num (eql "A")) (print "a specifict string")))
=> doesn't compile
To dlatego, że dostał składnia złego. Powinno być:
(defmethod some-fn ((num (eql "A"))) (print "a specific string"))
=> does compile
który jest zwykle sformatowane jako:
(defmethod some-fn ((num (eql "A")))
(print "a specifict string"))
przypadku sformatowania to w ten sposób i korzystać z wbudowanego narzędzia wcięcia swojego ulubionego edytora, można zobaczyć, że wygląda wcięć źle o kodzie:
(defmethod some-fn ((num (eql "A"))
(print "a specifict string")))
To również może pomóc, aby spróbować zrozumieć komunikatu o błędzie przedstawionego przez kompilator.
Powrót do tematu:
Można użyć ciągi jak każdy inny Lisp obiektu dla EQL przeciągu CLOSA.
Po prostu istnieje wiele możliwych ciągów, które wyglądają jak "A", a EQL porównuje tożsamość (z wyjątkiem liczb i znaków). EQL nie porównuje łańcuchów znaków według ich znaków.
Zazwyczaj (EQL "A" "A") zwraca NIL. (Nota boczna: W rzeczywistości w kodzie skompilowanym przez kompilator, to wyrażenie teoretycznie może być T. Ponieważ kompilator może ponownie wykorzystywać obiekty danych, aby zaoszczędzić miejsce w skompilowanym kodzie.Tutaj mamy dosłowne ciągi, obiekty danych).
Jeśli wpiszesz w wierszu poleceń
(some-fn "A")
nie spowoduje wysyłkę eql.
Ale to działa zgodnie z oczekiwaniami:
(defparameter *a-string* "A")
(defmethod some-fn ((num (eql *a-string*)))
(print "a specific string")))
a następnie
(some-fn *a-string*)
Musisz upewnić się, że zmienna ma wartość. Zmienna jest oceniana, gdy oceniane jest rozszerzenie makra formularza DEFMETHOD. Wartością jest wówczas obiekt, który jest używany do wysyłki EQL.
Jak wspomniał Dirk w swojej odpowiedzi, można używać symboli. Celem symboli jest to, że (EQL "| A |" | A |) jest zwykle T. Symbole są tworzone EQ podczas procesu czytania.
Podsumowanie:
EQL wysyłka w ciągu strun działa w CLOS. W celu praktycznego użycia, musisz wywołać funkcję z tym samym, pod względem EQL, ciągiem znaków.
Ops. Nawet nie zauważyłem błędu składni. Dobry połów. Technicznie, użycie tej samej instancji napisu (w przeciwieństwie do "ciągu o tej samej zawartości") oznacza ręczne przejście do jakiegoś polecenia/unifikacji, jeśli twoje ciągi pochodzą z zewnętrznych źródeł (powiedzmy, odczytane z pliku lub plików), które mogą renderowanie przy użyciu zwykłych łańcuchów jest niepraktyczne. – Dirk
Yup, skopiowałem to źle. Używam emacs etc ... To było pytanie od znajomego, na które nie mogłem odpowiedzieć. Lubię korzystać z defparam, aby to naprawić. Czy to jest całkowicie przenośne? – mhb
@mhb: tak, powinno być przenośne –