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

时间:2013-08-04 17:53:43

标签: string lisp character common-lisp

我有一个字符ch,我想要附加到字符串str。我意识到你可以连接像这样的字符串:

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

但这似乎效率低下。是否有更快的方法来追加单个字符?

2 个答案:

答案 0 :(得分:11)

如果字符串有填充指针,也可以调整。

Adjustable =可以改变它的大小。

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

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

答案 1 :(得分:7)

如果要多次扩展单个字符串,通常是这样 使用with-output-to-string,写入流非常高效 它提供。一定要使用write或princ等(而不是格式) 表现。