如何将字符附加到String的末尾

时间:2013-08-20 16:55:44

标签: common-lisp

从我的理解中,字符串是字符类型的向量。到目前为止,我的尝试一直没有实现

(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array

文字“Hol”是一个常数向量,与'(1 2 3)与(list 1 2 3)不一样吗?我应该只是明确地创建一个字符向量并为其添加字符吗?

1 个答案:

答案 0 :(得分:7)

你得到了正确的诊断。然而,这甚至不是文字数据(例如(list 1 2 3)'(1 2 3))相对于可修改数据的问题。这是矢量是否有fill pointervector-push and vector-push-extend的文档说 vector 参数是带有填充指针的向量。对于没有填充指针的非文字数组,您会收到类似的错误,如:

(let ((v (make-array 3)))
  (vector-push nil v))

您需要做的就是确保使用填充指针创建向量,并且它足够大以容纳您推送的内容:

(let ((v (make-array 2 :fill-pointer 0)))
  (print v)
  (vector-push 'x v)
  (print v)
  (vector-push 'y v)
  (print v)
  (vector-push 'z v)
  (print v))

vector-push不会调整数组,因此您在最终z的向量中不会vector-push

#() 
#(X) 
#(X Y) 
#(X Y) 

如果您使矢量可调,并使用vector-push-extend,则可以获得更大的数组:

(let ((v (make-array 2 :adjustable t :fill-pointer 0)))
  (print v)
  (vector-push 'x v)
  (print v)
  (vector-push 'y v)
  (print v)
  (vector-push-extend 'z v)
  (print v))

#() 
#(X) 
#(X Y) 
#(X Y Z) 

使用元素类型character,您将使用字符串执行此操作:

(let ((v (make-array 2 :element-type 'character :adjustable t :fill-pointer 0)))
  (print v)
  (vector-push #\x v)
  (print v)
  (vector-push #\y v)
  (print v)
  (vector-push-extend #\z v)
  (print v))

"" 
"x" 
"xy" 
"xyz"