4.1 数组 (Array)
在 Common Lisp 里,你可以调用 make-array
来构造一个数组,第一个实参为一个指定数组维度的列表。要构造一个 2 x 3
的数组,我们可以:
> (setf arr (make-array '(2 3) :initial-element nil))
#<Simple-Array T (2 3) BFC4FE>
Common Lisp 的数组至少可以达到七个维度,每个维度至少可以容纳 1023 个元素。
:initial-element
实参是选择性的。如果有提供这个实参,整个数组会用这个值作为初始值。若试着取出未初始化的数组内的元素,其结果为未定义(undefined)。
用 aref
取出数组内的元素。与 Common Lisp 的存取函数一样, aref
是零索引的(zero-indexed):
> (aref arr 0 0)
NIL
要替换数组的某个元素,我们使用 setf
与 aref
:
> (setf (aref arr 0 0) 'b)
B
> (aref arr 0 0)
B
要表示字面常量的数组(literal array),使用 #na
语法,其中 n
是数组的维度。举例来说,我们可以这样表示 arr
这个数组:
#2a((b nil nil) (nil nil nil))
如果全局变量 *print-array*
为真,则数组会用以下形式来显示:
> (setf *print-array* t)
T
> arr
#2A((B NIL NIL) (NIL NIL NIL))
如果我们只想要一维的数组,你可以给 make-array
第一个实参传一个整数,而不是一个列表:
> (setf vec (make-array 4 :initial-element nil))
#(NIL NIL NIL NIL)
一维数组又称为向量(vector)。你可以通过调用 vector
来一步骤构造及填满向量,向量的元素可以是任何类型:
> (vector "a" 'b 3)
#("a" b 3)
字面常量的数组可以表示成 #na
,字面常量的向量也可以用这种语法表达。
可以用 aref
来存取向量,但有一个更快的函数叫做 svref
,专门用来存取向量。
> (svref vec 0)
NIL
在 svref
内的 “sv” 代表“简单向量”(“simple vector”),所有的向量缺省是简单向量。 [1]
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .