字元和字串的比較運算子

Common Lisp 有 12 種型別特定的運算子來比較兩個字元,其中 6 個區分大小寫,其他區分不區分大小寫。他們的名字有一個簡單的模式,以便於記住他們的意思:

區分大小寫 不區分大小寫
CHAR = CHAR-EQUAL
CHAR / = CHAR-不等於
CHAR < CHAR-LESSP
CHAR <= CHAR-NOT-GREATERP
CHAR> CHAR-GREATERP
CHAR> = CHAR-NOT-LESSP

相同情況的兩個字元與 CHAR-CODE 獲得的相應程式碼的順序相同,而對於不區分大小寫的比較,取自兩個範圍 a..zA..Z 的任意兩個字元之間的相對順序是依賴於實現的。例子:

(char= #\a #\a)
T ;; => the operands are the same character
(char= #\a #\A)
NIL ;; => case sensitive equality
(CHAR-EQUAL #\a #\A)
T ;; => case insensitive equality
(char> #\b #\a)
T ;; => since in all encodings (CHAR-CODE #\b) is always greater than (CHAR-CODE #\a)
(char-greaterp #\b \#A)
T ;; => since for case insensitive the ordering is such that A=a, B=b, and so on,
  ;;    and furthermore either 9<A or Z<0.
(char> #\b #\A)
?? ;; => the result is implementation dependent

對於字串,特定的運算子是 STRING=STRING-EQUAL 等,使用 STRING 而不是 CHAR。兩個字串相等,如果它們具有相同的字元數在 correspending 字元根據 CHAR=CHAR-EQUAL 相等如果測試是大小寫敏感或沒有。

字串之間的順序是對兩個字串的字元的字典順序。當排序比較成功時,結果不是 T,而是兩個字串不同的第一個字元的索引(相當於 true,因為每個非 NIL 物件在 Common Lisp 中是一個通用布林值)。

重要的是,字串上的所有比較運算子接受四個關鍵字引數:start1end1start2end2,可用於將比較限制為僅在一個或兩個字串內連續執行的字元。如果省略的起始索引是 0,則省略結束索引等於字串的長度,並且對從索引為:start 的字元開始並且包含索引:end - 1 的字元終止的子字串執行比較。

最後,請注意,即使是單個字元,字串也無法與字元進行比較。

例子:

(string= "foo" "foo")
T ;; => both strings have the same lenght and the characters are `CHAR=` in order
(string= "Foo" "foo")
NIL ;; => case sensitive comparison
(string-equal "Foo" "foo")
T ;; => case insensitive comparison
(string= "foobar" "barfoo" :end1 3 :start2 3)
T ;; => the comparison is perform on substrings
(string< "fooarr" "foobar")
3 ;; => the first string is lexicographically less than the second one and 
  ;;   the first character different in the two string has index 3
(string< "foo" "foobar")
3 ;; => the first string is a prefix of the second and the result is its length

作為特殊情況,字串比較運算子也可以應用於符號,並且在符號的 SYMBOL-NAME 上進行比較。例如:

(string= 'a "A")
T ;; since (SYMBOL-NAME 'a) is "A"
(string-equal '|a| 'a)
T ;; since the the symbol names are "a" and "A" respectively

作為最後的註釋,字元上的 EQL 相當於 CHAR=; 字串上的 EQUAL 相當於 STRING=,而字串上的 EQUALP 相當於 STRING-EQUAL