字元和字串的比較運算子
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..z
,A..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 中是一個通用布林值)。
重要的是,字串上的所有比較運算子都接受四個關鍵字引數:start1
,end1
,start2
,end2
,可用於將比較限制為僅在一個或兩個字串內連續執行的字元。如果省略的起始索引是 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
。