4
從我的理解字符串是字符類型的向量。到目前爲止,我嘗試過徒勞如何在字符串的末尾附加字符
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
是文本「Hol的」以同樣的方式恆定向量「(1 2 3)是不一樣的(表1 2 3)?我應該創建一個明確的字符向量並添加字符嗎?
從我的理解字符串是字符類型的向量。到目前爲止,我嘗試過徒勞如何在字符串的末尾附加字符
(vector-push #\a "Hol")
;; "Hol" Is not of type vector and simple-array
是文本「Hol的」以同樣的方式恆定向量「(1 2 3)是不一樣的(表1 2 3)?我應該創建一個明確的字符向量並添加字符嗎?
你有正確的診斷。儘管如此,它甚至不是文字數據的問題(例如,(list 1 2 3)
與'(1 2 3)
)。這是矢量是否有fill pointer。 vector-push
and 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
不調整陣列,讓您在矢量從最終vector-push
得到不z
:
#()
#(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"
一問題,爲什麼你把@ char作爲最初的元素。 (char-code#\ @) - > 64,它是文字@符號的代碼點。 – PuercoPop
@PuercoPop我的第一個例子包括初始元素,所以爲了儘可能少地改變,我在字符串例子中使用了一個初始元素。但是,如果字符串的初始元素不是字符,SBCL會發出錯誤信號,因此我使用了一個恰好是'#\ @'的字符。但是,這些示例都不需要初始元素,所以我已將它們從示例中刪除。 –