LISP - 数组(Arrays)

LISP - 数组(Arrays) 首页 / LISP入门教程 / LISP - 数组(Arrays)

LISP允许您使用 make-array 函数定义一维或多维数组,数组可以存储任何LISP对象作为其元素。

所有数组均包含连续的内存位置,最低地址对应于第一个元素,最高地址对应于最后一个元素。

Rank


在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

除了 dimensions 参数外,所有其他参数都是关键字,下表提供了参数的简要说明。

Sr.No.Argument & 描述
1

dimensions

链接:https://www.learnfk.comhttps://www.learnfk.com/lisp/lisp-arrays.html

来源:LearnFk无涯教程网

对于一维数组,它是一个数字;对于多维数组,它是一个列表。

2

:element-type

它是类型说明符,默认值为T,即任何类型

3

:initial-element

初始元素值。它将创建一个数组,其中所有元素都初始化为特定值。

4

:initial-contents

初始内容作为对象 。

5

:adjustable

该参数是一个布尔值,指示数组是否可调整,默认值为NIL。

6

:fill-pointer

它跟踪可调整大小的向量中实际存储的元素数。

7

:displaced-to

它有助于创建置换数组或与指定数组共享其内容的共享数组。

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))

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

趣谈网络协议 -〔刘超〕

Go语言从入门到实战 -〔蔡超〕

编辑训练营 -〔总编室〕

成为AI产品经理 -〔刘海丰〕

手把手教你玩音乐 -〔邓柯〕

郭东白的架构课 -〔郭东白〕

李智慧 · 高并发架构实战课 -〔李智慧〕

大厂广告产品心法 -〔郭谊〕

Go进阶 · 分布式爬虫实战 -〔郑建勋〕

好记忆不如烂笔头。留下您的足迹吧 :)