4.1 数组 (Array)

在 Common Lisp 里,你可以调用 make-array 来构造一个数组,第一个实参为一个指定数组维度的列表。要构造一个 2 x 3 的数组,我们可以:

  1. > (setf arr (make-array '(2 3) :initial-element nil))
  2. #<Simple-Array T (2 3) BFC4FE>

Common Lisp 的数组至少可以达到七个维度,每个维度至少可以容纳 1023 个元素。

:initial-element 实参是选择性的。如果有提供这个实参,整个数组会用这个值作为初始值。若试着取出未初始化的数组内的元素,其结果为未定义(undefined)。

aref 取出数组内的元素。与 Common Lisp 的存取函数一样, aref 是零索引的(zero-indexed):

  1. > (aref arr 0 0)
  2. NIL

要替换数组的某个元素,我们使用 setfaref

  1. > (setf (aref arr 0 0) 'b)
  2. B
  3. > (aref arr 0 0)
  4. B

要表示字面常量的数组(literal array),使用 #na 语法,其中 n 是数组的维度。举例来说,我们可以这样表示 arr 这个数组:

  1. #2a((b nil nil) (nil nil nil))

如果全局变量 *print-array* 为真,则数组会用以下形式来显示:

  1. > (setf *print-array* t)
  2. T
  3. > arr
  4. #2A((B NIL NIL) (NIL NIL NIL))

如果我们只想要一维的数组,你可以给 make-array 第一个实参传一个整数,而不是一个列表:

  1. > (setf vec (make-array 4 :initial-element nil))
  2. #(NIL NIL NIL NIL)

一维数组又称为向量(vector)。你可以通过调用 vector 来一步骤构造及填满向量,向量的元素可以是任何类型:

  1. > (vector "a" 'b 3)
  2. #("a" b 3)

字面常量的数组可以表示成 #na ,字面常量的向量也可以用这种语法表达。

可以用 aref 来存取向量,但有一个更快的函数叫做 svref ,专门用来存取向量。

  1. > (svref vec 0)
  2. NIL

svref 内的 “sv” 代表“简单向量”(“simple vector”),所有的向量缺省是简单向量。 [1]