4

私の理解では、文字列は文字型のベクトルです。これまでのところ、私の試みは実を結びませんでした

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

リテラル "Hol" は、'(1 2 3) が (list 1 2 3) と同じではないのと同じように定数ベクトルですか? 文字のベクトルを明示的に作成し、それに文字を追加する必要がありますか?

4

1 に答える 1

7

あなたは正しい診断を受けています。ただし、リテラル データ ( (list 1 2 3)vs.'(1 2 3)など) と変更可能なデータの問題でさえありません。ベクトルにフィル ポインターがあるかどうかです。vector-pushandvector-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" 
于 2013-08-20T16:57:28.330 に答える