字符和字符串的比较运算符

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