字符串是字符的向量。我们把常量字符串看成是一系列被双引号包括的字符,一个单独的字符c被表示为#\c。
通常(但不是必须的),每个字符都会有一个相关的整数,这个整数就是ASCII码。在多数的实现中,函数char-code返回与一个字符相关的数字,code-char返回对应数字的字符。
函数char<(小于),char<= (小于等于),char=(等于equal), char>=(大于等于),char>(大于)和char/=(不同)用来比较字符。它们像数字比较符号一样工作。
[15]> (sort "elbow" #'char<)
"below"
因为字符串是向量,序列函数和数组函数也可以作用于字符串。你可以使用aref来获取元素,比如:
[16]> (aref "abc" 1)
#\b
但是你可以对字符串使用更加快速的char函数:
[17]> (char "abc" 1)
#\b
你可以组合使用setf和char(或者aref)来替换元素:
[19]> (let ((str (copy-seq "Merlin"))) (setf (char str 3) #\k) str)
"Merkin"
如果你想要比较两个字符串,你可以使用通用的equal,但是也有一个叫做string-equal的函数,这个函数会忽略大小写:
[20]> (equal "fred" "fred")
T
[21]> (equal "fred" "Fred")
NIL
[22]> (string-equal "fred" "Fred")
T
Common Lisp提供了大量的比较和操作字符串的函数。有几种方式来创建字符串。最通用的方式是使用format函数。调用format时,把nil作为第一个参数,将会使它作为一个字符串返回,也就是即将要打印出的哪个字符串:
[23]> (format nil "~A or ~A" "truth" "dare")
"truth or dare"
但是如果你仅仅时想将多个字符串结合在一起,你可以使用concatenate函数,它接受一个符号,这个符号用来指定结果的类型,加上一个或者多个序列:
[26]> (concatenate 'string "not " "to worry")
"not to worry"