字符和字符串的比较运算符
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
。