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)
    
  • 填充指针

    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)
    
    向量是序列,所有序列函数都适用于向量。有关向量函数,请参阅序列章节。