aref无效 lisp_LISP - 数组

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

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

数组的维数称为其等级。

在LISP中,数组元素由非负整数索引序列指定。序列的长度必须等于数组的等级。索引从零开始。

例如,要创建一个带有10-个单元格的数组,名为my-array,我们可以写:

(setfmy-array(make-array"(10)))

aref函数允许访问单元格的内容。它需要两个参数,数组的名称和索引值。

例如,要访问第十个单元格的内容,我们写:

(arefmy-array9)

实施例1

创建一个名为main.lisp的新的源代码文件,并在其中键入以下代码。

(write(setfmy-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 "((012)(345)(678))))(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

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

论据

描述

尺寸

它给出了数组的尺寸。它是一维数组的一维数组和多维数组的列表。

:元素类型

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

:initial-element

初始元素值。它将使所有元素初始化为特定值的数组。

:初始内容

初始内容为对象。

:可调

它有助于创建一个可调整大小(或可调整的)向量,其底层内存可以调整大小。参数是一个布尔值,指示数组是否可调,默认值为NIL。

:填充指针

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

:流离失所

它有助于创建与指定数组共享其内容的位移数组或共享数组。这两个数组应该具有相同的元素类型。以下的:displacement-to选项可能不与:initial-element或:initial-contents选项一起使用。此参数默认为nil。

:displacement-index-offset

它给出了创建的共享数组的索引偏移量。

实施例4

创建一个名为main.lisp的新的源代码文件,并在其中键入以下代码。

(setq myarray(make-array"(3 2 3)

:initial-contents

"(((a b c)(123))((d e f)(456))((g h i)(789)))))(setq array2(make-array4:displaced-to myarray:displaced-index-offset2))(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)(123))((d e f)(456))((g h i)(789)))))(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)(123))((d e f)(456))((g h i)(789)))))(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 arraywith5elements,;initail value5(write(make-array5:initial-element5))(terpri);two dimensional array,withinitial element a(write(make-array"(2 3) :initial-element "a))(terpri);an array of capacity14,but fill pointer5,is5(write(length(make-array14:fill-pointer5)))(terpri);however its lengthis14(write(array-dimensions(make-array14:fill-pointer5)))(terpri);a bit arraywithall initial elementssetto1(write(make-array10: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 arraywithinitial 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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值