LISP - 字符串长度
Lisp - 获取序列的长度
Section titled “Lisp - 获取序列的长度”在 Common Lisp 中,length 是一个通用函数,用于查找任何序列中的元素数量。由于字符串是一种序列(特别是字符向量),length 是确定字符串长度的标准函数。
用法很简单:将序列作为参数传递给 length 函数。
示例:获取字符串的长度
Section titled “示例:获取字符串的长度”让我们定义一个字符串,并使用 length 函数来获取其字符数。
;; Define a string using a local variable(let ((my-string "Modern Lisp is powerful!")) ;; Get its length (length my-string))24一个常见的混淆点:引用(Quoting)
Section titled “一个常见的混淆点:引用(Quoting)”初学者常犯的一个错误是引用字符串字面量,例如 (length '"my-string")。这是不正确的。单引号(')是 quote 特殊操作符的简写,它会阻止求值。
"my-string":这是一个字符串字面量。它求值自身,即一个包含字符的字符串对象。'"my-string":这是一个符号(symbol)。它求值得到其名称为my-string的符号。符号不是字符串,尝试获取其长度将导致错误。
;; CORRECT: Get the length of a string(length "Hello") ; => 5
;; INCORRECT: Tries to get the length of the *symbol* named "Hello";; (length '"Hello") ; => This will signal a type error.关键概念:Unicode 和性能
Section titled “关键概念:Unicode 和性能”Unicode 字符
Section titled “Unicode 字符”现代 Lisp 实现完全支持 Unicode。length 函数正确地计算字符的数量,而不是字节的数量。这几乎总是您想要的行为。
;; The string contains 5 characters, including a Unicode emoji.(length "Hi 👋 Lisp")9性能:字符串的 O(1)
Section titled “性能:字符串的 O(1)”了解 length 对于字符串和向量来说是非常快的操作是很有用的。它的时间复杂度是常数,即 O(1),因为长度是与对象本身一起存储的。
相比之下,对列表调用 length 是一个较慢的操作。该函数必须遍历整个列表以计算其元素,使其成为线性时间,即 O(n) 的操作。
;; Fast: O(1) operation(length "a very very long string...")
;; Slower: O(n) operation(length '(a very very long list ...))