在Common Lisp中将字符添加到字符串

9

我有一个字符ch,想要将其追加到字符串str中。我知道你可以通过以下方式连接字符串:

(setf str (concatenate 'string str (list ch)))

但这似乎相当低效。有没有更快的方法只添加一个字符?
2个回答

14
如果字符串具有填充指针,并且可能还是可调整大小的。
可调整大小的意思是可以改变其大小。
填充指针是指内容的大小,长度可以小于字符串的大小。
VECTOR-PUSH表示在末尾添加一个元素并增加填充指针。
VECTOR-PUSH-EXTEND与VECTOR-PUSH相同,如果数组太小,还会调整数组的大小。
我们可以从普通字符串创建一个可调整大小的字符串。
CL-USER 32 > (defun make-adjustable-string (s)
               (make-array (length s)
                           :fill-pointer (length s)
                           :adjustable t
                           :initial-contents s
                           :element-type (array-element-type s)))
MAKE-ADJUSTABLE-STRING
VECTOR-PUSH-EXTEND 然后可以将字符添加到字符串的末尾。在这里,我们将字符 #\! 添加到字符串 "Lisp" 的末尾。结果字符串为 "Lisp!"
CL-USER 33 > (let ((s (make-adjustable-string "Lisp")))
               (vector-push-extend #\! s)
               s)
"Lisp!"

8

如果您想多次扩展一个字符串,通常使用 with-output-to-string 并写入其提供的流是非常高效的。请务必使用 write 或 princ 等操作(而不是 format)以提高性能。


1
或者选择更为晦涩的方式,确保 FORMAT 字符串可以编译。 - Rainer Joswig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接