LISP - 向量
向量是一维数组,因此是数组的子类型。 向量和列表统称为序列。 因此,我们到目前为止讨论的所有序列通用函数和数组函数都适用于向量。
创建向量
向量函数允许您创建具有特定值的固定大小向量。 它接受任意数量的参数并返回包含这些参数的向量。
示例 1
创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
(setf v1 (vector 1 2 3 4 5)) (setf v2 #(a b c d e)) (setf v3 (vector 'p 'q 'r 's 't)) (write v1) (terpri) (write v2) (terpri) (write v3)
执行代码时,会返回以下结果 −
#(1 2 3 4 5) #(A B C D E) #(P Q R S T)
请注意,LISP 使用 #(...) 语法作为向量的文字表示法。 您可以使用此 #(... ) 语法来创建文字向量并将其包含在代码中。
但是,这些是文字向量,因此 LISP 中没有定义修改它们。 因此,对于编程,您应该始终使用 vector 函数,或更通用的函数 make-array 来创建您计划修改的向量。
make-array 函数是创建向量的更通用方法。 您可以使用 aref 函数访问向量元素。
示例 2
创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
(setq a (make-array 5 :initial-element 0)) (setq b (make-array 5 :initial-element 2)) (dotimes (i 5) (setf (aref a i) i)) (write a) (terpri) (write b) (terpri)
执行代码时,会返回以下结果 −
#(0 1 2 3 4) #(2 2 2 2 2)
fill-pointer
make-array 函数允许您创建可调整大小的向量。
函数的 fill-pointer 参数跟踪实际存储在向量中的元素数量。 它是向向量添加元素时要填充的下一个位置的索引。
vector-push 函数允许您将元素添加到可调整大小的向量的末尾。 它将填充指针增加 1。
vector-pop函数返回最近推送的项目并将填充指针减1。
示例
创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
(setq a (make-array 5 :fill-pointer 0)) (write a) (vector-push 'a a) (vector-push 'b a) (vector-push 'c a) (terpri) (write a) (terpri) (vector-push 'd a) (vector-push 'e a) ;this will not be entered as the vector limit is 5 (vector-push 'f a) (write a) (terpri) (vector-pop a) (vector-pop a) (vector-pop a) (write a)
执行代码时,会返回以下结果 −
#() #(A B C) #(A B C D E) #(A B)
向量是序列,所有序列函数都适用于向量。 有关矢量函数,请参阅序列章节。