Skip to content

LISP - 转义序列

在 Common Lisp 中,字符串是字符序列。与 C 或 Python 等语言不同,Lisp 字符串的转义序列非常少。特殊字符通常由函数或 format 控制序列处理,而不是直接嵌入到字符串字面量中。

在字符串字面量(由双引号 " 界定)中,只有两个字符需要使用反斜杠(\)进行转义:

  • \" - 在字符串内部包含一个字面双引号字符。示例:"He said, \"Greetings!\""。
  • \\ - 在字符串内部包含一个字面反斜杠字符。示例:"This is a file path: C:\\Users\\..."。

尽管某些 Lisp 实现可能支持 \n 或 \t,但处理控制字符的可移植且惯用的方式是通过 format 函数或在源代码中直接写入字面量换行符。

  • ~% 在 format 中:format 控制字符串中的 ~% 指令会插入一个换行符。
  • ~t 在 format 中:format 控制字符串中的 ~t 指令用于处理制表符。
  • 字面量换行符:你可以在编辑器中的字符串字面量内直接按 Enter 键。生成的字符串将包含换行符。

让我们看看这些概念的实际应用。将以下代码保存为 main.lisp 并运行它。

(defun demonstrate-strings ()
;; 示例 1:转义双引号
(let ((quote-string "She exclaimed, \"Lisp is powerful!\""))
(format t "Example 1: ~a~%" quote-string))
(terpri) ; 打印一个空行用于分隔
;; 示例 2:转义反斜杠
(let ((path-string "A windows-style path: C:\\Temp\\File"))
(format t "Example 2: ~a~%" path-string))
(terpri)
;; 示例 3:使用 FORMAT 处理换行符和制表符
(format t "Example 3:~%")
(format t "\t- First item~%\t- Second item~%"))
;; 运行演示
(demonstrate-strings)

执行此代码将产生以下结果:

Example 1: She exclaimed, "Lisp is powerful!"
Example 2: A windows-style path: C:\Temp\File
Example 3:
- First item
- Second item

在 Lisp 中,区分字符串和字符很重要:

  • 字符 字面量以 #\ 前缀书写。例如,#\A 是字符 ‘A’,#\Space 是空格字符。
  • 字符串 是字符序列,写在双引号内,如 "Hello"。
  • 这种区分对于专门操作字符的函数很重要,例如用于比较的 char=。
(characterp #\a) ; => T
(stringp "a") ; => T
(string= "a" (string #\a)) ; => T (如果转换,它们可以进行比较)