Skip to content

LISP - 字符串大小写转换

Common Lisp 提供了一套标准的函数,用于转换字符串中字符的大小写。这些函数主要有两种类型:构造性(非破坏性)和破坏性。

这些函数返回一个新字符串,其中包含转换后的大小写,而原始字符串保持不变。这是更安全、更常见的方法。

函数描述
string-upcase返回一个新字符串,其中所有字母字符都转换为大写。
string-downcase返回一个新字符串,其中所有字母字符都转换为小写。
string-capitalize返回一个新字符串,其中每个单词的首字母大写。

这些函数就地修改原始字符串。它们通常以 n(表示“non-consing”)开头命名。请谨慎使用它们,因为如果字符串在程序的其他地方共享,它们可能会导致意想不到的行为。它们主要用于关键代码路径中的性能优化。

函数描述
nstring-upcase修改字符串,将所有字母字符转换为大写。
nstring-downcase修改字符串,将所有字母字符转换为小写。
nstring-capitalize修改字符串,将每个单词的首字母大写。

创建一个 main.lisp 文件,看看非破坏性函数如何工作。

;;; main.lisp - 演示字符串大小写转换
(let ((original-string "a big HELLO from tutorials point"))
(format t "Original: ~s~%" original-string)
;; 构造性函数创建新字符串
(let ((lower (string-downcase original-string))
(upper (string-upcase original-string))
(capital (string-capitalize original-string)))
(format t "Downcased: ~s~%" lower)
(format t "Upcased: ~s~%" upper)
(format t "Capitalized: ~s~%" capital))
;; 原始字符串保持不变
(format t "After Ops: ~s~%" original-string))

执行此代码将产生:

Original: "a big HELLO from tutorials point"
Downcased: "a big hello from tutorials point"
Upcased: "A BIG HELLO FROM TUTORIALS POINT"
Capitalized: "A Big Hello From Tutorials Point"
After Ops: "a big HELLO from tutorials point"

所有这些函数都接受可选的 :start 和 :end 关键字参数,以仅对字符串的一部分进行操作。索引是基于零的。

(let ((my-string "a big hello from tutorials point"))
(format t "~%Original: ~s~%" my-string)
;; 仅将单词 "hello" 转换为大写(从索引 6 到 11)
(let ((partial-upper (string-upcase my-string :start 6 :end 11)))
(format t "Partially Up: ~s~%" partial-upper)))

这部分代码将输出:

Original: "a big hello from tutorials point"
Partially Up: "a big HELLO from tutorials point"
  • 优先选择非破坏性函数: 通常,始终使用非破坏性版本(如 string-upcase 等),除非您遇到经过测量的性能瓶颈,并且确定原始字符串数据未在其他地方使用。函数纯度使代码更容易理解。
  • 关键字参数: :start 和 :end 关键字参数是 Common Lisp 中所有序列函数(例如,列表、向量和字符串)的常见模式。掌握它们提供了一种一致的方式来操作子序列。
  • Unicode 和字符集: 现代 Common Lisp 实现通常支持 Unicode。大小写转换函数适用于各种国际字符,而不仅仅是 ASCII。