根据我的理解,字符串是字符类型的向量.到目前为止,我的尝试都是无用的
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
Run Code Online (Sandbox Code Playgroud)
文字"Hol"是一个常数向量,与'(1 2 3)不同(列表1 2 3)的方式相同吗?我应该只是明确地创建一个字符向量并添加字符吗?
你得到了正确的诊断.然而,它甚至不是文字数据(例如,(list 1 2 3)对比'(1 2 3))与可修改数据的关系.这是矢量是否有填充指针.文档说vector-push并且vector-push-extend说vector参数是带有填充指针的向量.对于没有填充指针的非文字数组,您会收到类似的错误,如:
(let ((v (make-array 3)))
(vector-push nil v))
Run Code Online (Sandbox Code Playgroud)
您需要做的就是确保使用填充指针创建向量,并且它足够大以容纳您推送的内容:
(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))
Run Code Online (Sandbox Code Playgroud)
vector-push不会调整数组,所以你不会z进入最后的向量vector-push:
#()
#(X)
#(X Y)
#(X Y)
Run Code Online (Sandbox Code Playgroud)
如果你使矢量可调,并使用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)
Run Code Online (Sandbox Code Playgroud)
使用元素类型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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
701 次 |
| 最近记录: |