2013-08-20 125 views
4

從我的理解字符串是字符類型的向量。到目前爲止,我嘗試過徒勞如何在字符串的末尾附加字符

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

是文本「Hol的」以同樣的方式恆定向量「(1 2 3)是不一樣的(表1 2 3)?我應該創建一個明確的字符向量並添加字符嗎?

回答

7

你有正確的診斷。儘管如此,它甚至不是文字數據的問題(例如,(list 1 2 3)'(1 2 3))。這是矢量是否有fill pointervector-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" 
+0

一問題,爲什麼你把@ char作爲最初的元素。 (char-code#\ @) - > 64,它是文字@符號的代碼點。 – PuercoPop

+1

@PuercoPop我的第一個例子包括初始元素,所以爲了儘可能少地改變,我在字符串例子中使用了一個初始元素。但是,如果字符串的初始元素不是字符,SBCL會發出錯誤信號,因此我使用了一個恰好是'#\ @'的字符。但是,這些示例都不需要初始元素,所以我已將它們從示例中刪除。 –

相關問題