从我的理解中,字符串是字符类型的向量。到目前为止,我的尝试一直没有实现
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
文字“Hol”是一个常数向量,与'(1 2 3)与(list 1 2 3)不一样吗?我应该只是明确地创建一个字符向量并为其添加字符吗?
答案 0 :(得分:7)
你得到了正确的诊断。然而,这甚至不是文字数据(例如(list 1 2 3)
与'(1 2 3)
)相对于可修改数据的问题。这是矢量是否有fill pointer。 vector-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"