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

问题描述 投票:0回答:2

我有一个字符

ch
,我想将其附加到字符串
str
。我意识到你可以像这样连接字符串:

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

但这似乎效率很低。有没有更快的方法来附加单个字符?

string lisp character common-lisp
2个回答
13
投票

如果字符串有一个填充指针并且也许也是可调整

可调节=可以改变其尺寸。

fill-pointer = 内容大小,长度,可以小于字符串大小。

VECTOR-PUSH
= 在末尾添加一个元素并增加填充指针。

VECTOR-PUSH-EXTEND
= as
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”的末尾:

CL-USER 33 > (let ((s (make-adjustable-string "Lisp")))
               (vector-push-extend #\! s)
               s)
"Lisp!"

8
投票

如果你想多次扩展单个字符串,通常是 使用 with-output-to-string 写入流时性能非常好 它提供。请务必使用 write 或 princ 等(而不是 format) 为了性能。

© www.soinside.com 2019 - 2024. All rights reserved.