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-pushvector-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 回答