LISP - 数组

  • 简述

    LISP 允许您使用make-array函数。数组可以存储任何 LISP 对象作为它的元素。
    所有数组都由连续的内存位置组成。最低地址对应第一个元素,最高地址对应最后一个元素。
    秩
    数组的维数称为其秩。
    在 LISP 中,数组元素由一系列非负整数索引指定。序列的长度必须等于数组的秩。索引从零开始。
    例如,要创建一个包含 10 个单元格的数组,命名为 my-array,我们可以这样写:
    
    (setf my-array (make-array '(10)))
    
    aref 函数允许访问单元格的内容。它有两个参数,数组名和索引值。
    例如,要访问第十个单元格的内容,我们写 -
    
    (aref my-array 9)
    
  • 示例 1

    创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
    
    (write (setf my-array (make-array '(10))))
    (terpri)
    (setf (aref my-array 0) 25)
    (setf (aref my-array 1) 23)
    (setf (aref my-array 2) 45)
    (setf (aref my-array 3) 10)
    (setf (aref my-array 4) 20)
    (setf (aref my-array 5) 17)
    (setf (aref my-array 6) 25)
    (setf (aref my-array 7) 19)
    (setf (aref my-array 8) 67)
    (setf (aref my-array 9) 30)
    (write my-array)
    
    当您执行代码时,它返回以下结果 -
    
    #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
    #(25 23 45 10 20 17 25 19 67 30)
    
  • 示例 2

    让我们创建一个 3×3 数组。
    创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
    
    (setf x (make-array '(3 3) 
       :initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))
    )
    (write x)
    
    当您执行代码时,它返回以下结果 -
    
    #2A((0 1 2) (3 4 5) (6 7 8))
    
  • 示例 3

    创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
    
    (setq a (make-array '(4 3)))
    (dotimes (i 4)
       (dotimes (j 3)
          (setf (aref a i j) (list i 'x j '= (* i j)))
       )
    )
    (dotimes (i 4)
       (dotimes (j 3)
          (print (aref a i j))
       )
    )
    
    当您执行代码时,它返回以下结果 -
    
    (0 X 0 = 0) 
    (0 X 1 = 0) 
    (0 X 2 = 0) 
    (1 X 0 = 0) 
    (1 X 1 = 1) 
    (1 X 2 = 2) 
    (2 X 0 = 0) 
    (2 X 1 = 2) 
    (2 X 2 = 4) 
    (3 X 0 = 0) 
    (3 X 1 = 3) 
    (3 X 2 = 6)
    
  • make-array 函数的完整语法

    make-array 函数接受许多其他参数。让我们看看这个函数的完整语法 -
    
    make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer  :displaced-to :displaced-index-offset
    
    除了维度参数之外,所有其他参数都是关键字。下表提供了参数的简要说明。
    序号 Argument & Description
    1
    dimensions
    它给出了数组的维度。一维数组是数字,多维数组是列表。
    2
    :element-type
    是类型说明符,默认值为T,即任意类型
    3
    :initial-element
    初始元素值。它将创建一个数组,其中所有元素都初始化为特定值。
    4
    :initial-content
    作为对象的初始内容。
    5
    :adjustable
    它有助于创建一个可调整大小(或可调整)的向量,其底层内存可以调整大小。参数是一个布尔值,表示数组是否可调,默认值为 NIL。
    6
    :fill-pointer
    它跟踪实际存储在可调整大小向量中的元素数量。
    7
    :displaced-to
    它有助于创建与指定数组共享其内容的置换数组或共享数组。两个数组应具有相同的元素类型。:displaced-to 选项不能与 :initial-element 或 :initial-contents 选项一起使用。此参数默认为零。
    8
    :displaced-index-offset
    它给出了创建的共享数组的索引偏移量。

    例 4

    创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
    
    (setq myarray (make-array '(3 2 3) 
       :initial-contents 
       '(((a b c) (1 2 3)) 
          ((d e f) (4 5 6)) 
          ((g h i) (7 8 9)) 
       ))
    ) 
    (setq array2 (make-array 4 :displaced-to myarray :displaced-index-offset 2)) 
    (write myarray)
    (terpri)
    (write array2)
    
    当您执行代码时,它返回以下结果 -
    
    #3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
    #(C 1 2 3)
    
    如果置换数组是二维的 -
    
    (setq myarray (make-array '(3 2 3) 
       :initial-contents 
       '(((a b c) (1 2 3)) 
          ((d e f) (4 5 6)) 
          ((g h i) (7 8 9)) 
       ))
    ) 
    (setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 2)) 
    (write myarray)
    (terpri)
    (write array2)
    
    当您执行代码时,它返回以下结果 -
    
    #3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
    #2A((C 1) (2 3) (D E))
    
    让我们将置换索引偏移量更改为 5 -
    
    (setq myarray (make-array '(3 2 3) 
       :initial-contents 
       '(((a b c) (1 2 3)) 
          ((d e f) (4 5 6)) 
          ((g h i) (7 8 9)) 
       ))
    ) 
    (setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 5)) 
    (write myarray)
    (terpri)
    (write array2)
    
    当您执行代码时,它返回以下结果 -
    
    #3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
    #2A((3 D) (E F) (4 5))
    

    例 5

    创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
    
    ;a one dimensional array with 5 elements, 
    ;initail value 5
    (write (make-array 5 :initial-element 5))
    (terpri)
    ;two dimensional array, with initial element a
    (write (make-array '(2 3) :initial-element 'a))
    (terpri)
    ;an array of capacity 14, but fill pointer 5, is 5
    (write(length (make-array 14 :fill-pointer 5)))
    (terpri)
    ;however its length is 14
    (write (array-dimensions (make-array 14 :fill-pointer 5)))
    (terpri)
    ; a bit array with all initial elements set to 1
    (write(make-array 10 :element-type 'bit :initial-element 1))
    (terpri)
    ; a character array with all initial elements set to a
    ; is a string actually
    (write(make-array 10 :element-type 'character :initial-element #\a)) 
    (terpri)
    ; a two dimensional array with initial values a
    (setq myarray (make-array '(2 2) :initial-element 'a :adjustable t))
    (write myarray)
    (terpri)
    ;readjusting the array
    (adjust-array myarray '(1 3) :initial-element 'b) 
    (write myarray)
    
    当您执行代码时,它返回以下结果 -
    
    #(5 5 5 5 5)
    #2A((A A A) (A A A))
    5
    (14)
    #*1111111111
    "aaaaaaaaaa"
    #2A((A A) (A A))
    #2A((A A B))