你必須告訴remove-duplicates它應該如何比較值。默認情況下,它使用eql
,這不足以用於字符串。傳遞:test
功能,如:
(remove-duplicates your-sequence :test #'equal).
(編輯以解決意見的問題):作爲一種替代equal
,你可以在這個例子中使用string=
。這個謂詞(在某種程度上)不如equal
通用,它可能(可能最終可能最終......)因此會更快。一個真正的好處可能是,那string=
可以告訴你,如果你傳遞一個錯誤的值:
(equal 1 "foo")
高興地產生nil
,而
(string= 1 "foo")
給出了一個type-error
條件。但是請注意,這
(string= "FOO" :FOO)
是完全明確定義(string=
和其朋友在「字符串代號」不是字符串來定義),所以類型安全就只能到此爲止這裏。
另一方面,標準的eql
謂詞幾乎從來都不是比較字符串的正確方法。如果您熟悉Java語言,請將eql
視爲使用==
,而將equal
(或string=
等)調用equals(Object)
方法。雖然eql
做了一些類型的自省(與eq
不同),但對於大多數(非數字)lisp類型,eql
歸結爲類似於指針比較的東西,但如果您想根據它們實際上包含的內容,而不僅僅是它們在內存中的位置。
對於更Python傾斜,eq
(和eql
用於非數字類型)是更像is
操作者,而equal
更像==
它調用__eq__
。
我會試圖使用STRING =而不是EQUAL。 – Vatine
爲什麼?有什麼不同? – rivasket
STRING =使用根據[HyperSpec](http://www.lispworks.com/documentation/HyperSpec/Body/f_chareq.htm#char-equal)的CHAR =比較字符「...如果所有字符都是如果兩個字符在任何實現定義的屬性中不同,那麼它們不是char =「。我不確定使用實現定義的行爲是一個更好的選擇。 –