4.3 字符与字符串 (Strings and Characters)

字符串是字符组成的向量。我们用一系列由双引号包住的字符,来表示一个字符串常量,而字符 c#\c 表示。

每个字符都有一个相关的整数 ── 通常是 ASCII 码,但不一定是。在多数的 Lisp 实现里,函数 char-code 返回与字符相关的数字,而 code-char 返回与数字相关的字符。

字符比较函数 char< (小于), char<= (小于等于), char= (等于), char>= (大于等于) , char> (大于),以及 char/= (不同)。他们的工作方式和 146 页(译注 9.3 节)比较数字用的操作符一样。

  1. > (sort "elbow" #'char<)
  2. "below"

由于字符串是字符向量,序列与数组的函数都可以用在字符串。你可以用 aref 来取出元素,举例来说,

  1. > (aref "abc" 1)
  2. #\b

但针对字符串可以使用更快的 char 函数:

  1. > (char "abc" 1)
  2. #\b

可以使用 setf 搭配 char (或 aref )来替换字符串的元素:

  1. > (let ((str (copy-seq "Merlin")))
  2. (setf (char str 3) #\k)
  3. str)

如果你想要比较两个字符串,你可以使用通用的 equal 函数,但还有一个比较函数,是忽略字母大小写的 string-equal

  1. > (equal "fred" "fred")
  2. T
  3. > (equal "fred" "Fred")
  4. NIL
  5. >(string-equal "fred" "Fred")
  6. T

Common Lisp 提供大量的操控、比较字符串的函数。收录在附录 D,从 364 页开始。

有许多方式可以创建字符串。最普遍的方式是使用 format 。将第一个参数设为 nil 来调用 format ,使它返回一个原本会印出来的字符串:

  1. > (format nil "~A or ~A" "truth" "dare")
  2. "truth or dare"

但若你只想把数个字符串连结起来,你可以使用 concatenate ,它接受一个特定类型的符号,加上一个或多个序列:

  1. > (concatenate 'string "not " "to worry")
  2. "not to worry"