Skip to content

LISP - 字符串合并

Common Lisp 提供了几种强大的机制来组合或拼接字符串。掌握这些基本技术是编写清晰高效 Lisp 代码的关键。本教程涵盖了标准内置方法,并介绍了使用流行社区库的现代最佳实践。

  • concatenate:用于连接任何类型序列(包括字符串)的标准通用函数。
  • format:一个强大而灵活的工具,用于从各种数据类型创建格式化字符串。
  • str:concat(现代实践):来自流行 str 库的便捷函数,在现代项目中经常被首选。

concatenate 函数是 Common Lisp 中用于连接序列的标准工具。要将其用于字符串,必须将 'string 指定为第一个参数,表示结果序列的类型。它可以连接两个或更多的字符串。

;; CONCATENATE 函数要求结果类型作为其第一个参数。
(concatenate 'string "Hello, " "World!" " Welcome to Lisp.")
;; 输出:
;; "Hello, World! Welcome to Lisp."

format 是 Common Lisp 中用于生成格式化文本的多功能工具,类似于 C 语言中的 printf。它使用控制指令(如 ~a 用于美学表示,或 ~s 用于语法表示)将值嵌入到字符串模板中。

你可以将输出定向到流(如 t 代表标准输出),或者通过使用 nil 作为第一个参数使其返回一个新字符串。

;; 使用 FORMAT 构建并返回一个字符串(目标为 nil)。
(let ((name "Alex")
(language "Common Lisp"))
(format nil "Hello, ~a! Welcome to the world of ~a." name language))
;; 输出:
;; "Hello, Alex! Welcome to the world of Common Lisp."
;; 使用 FORMAT 直接打印到控制台(目标为 t)。
(format t "~%This message is printed directly.")
;; 输出到控制台:
;; This message is printed directly.

在现代 Lisp 开发中,许多程序员使用 str 库,因为它方便且功能丰富。它提供了一个简单的 str:concat 函数,对于简单的字符串连接来说,通常比 concatenate 更具可读性。

要使用 str 库,你需要一个包管理器,如 Quicklisp。典型的流程如下:

;; 1. 加载 Quicklisp(假设已设置)。
(ql:quickload "str")
;; 2. 现在你可以使用库中的函数了。
(str:concat "Modern " "Lisp " "is " "awesome!")
;; 输出:
;; "Modern Lisp is awesome!"

重要的是不要将字符串拼接与序列合并混淆。Common Lisp 中的 merge 函数用于根据谓词将两个已排序的序列合并为一个单一的已排序序列。

以下示例演示了 merge 如何处理字符串列表。它不会将它们首尾相连地拼接起来,而是根据 string< 谓词定义的字母顺序交错排列它们。

(let ((list1 '("apple" "mango" "peach"))
(list2 '("banana" "cherry" "orange")))
(merge 'list list1 list2 #'string<))
;; 输出:
;; ("apple" "banana" "cherry" "mango" "orange" "peach")
  • 对于简单、直接的拼接:在现代项目中,使用 str:concat 以提高可读性。
  • 对于嵌入值和复杂格式化:format 是无与伦比的标准选择。
  • 对于通用序列连接:concatenate 是低级、强大的工具,当你需要明确序列类型时使用。
  • 对于有序交错:仅当你需要组合已排序的序列时才使用 merge,而不是用于简单的拼接。