据我了解,字符串是字符类型的向量。到目前为止,我的尝试都没有结果
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
文字“Hol”是否是一个常数向量,其方式与 '(1 2 3) 与 (list 1 2 3) 不同?我应该明确地创建一个字符向量并向其中添加字符吗?
据我了解,字符串是字符类型的向量。到目前为止,我的尝试都没有结果
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
文字“Hol”是否是一个常数向量,其方式与 '(1 2 3) 与 (list 1 2 3) 不同?我应该明确地创建一个字符向量并向其中添加字符吗?
你得到了正确的诊断。不过,这甚至不是文字数据(例如,(list 1 2 3)
vs '(1 2 3)
.)与可修改数据的问题。这是向量是否有填充指针。vector-push
并vector-push-extend
说向量参数的文档是带有填充指针的向量。对于没有填充指针的非文字数组,您会遇到类似的错误,如下所示:
(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
从 final 中得到向量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"