鍍金池/ 教程/ Java/ LISP - 數(shù)組
LISP - 樹
LISP - 錯(cuò)誤處理
LISP - 謂詞
LISP - 決策
LISP - 變量
LISP - 數(shù)組
LISP - 對象系統(tǒng)(CLOS)
LISP - 輸入和輸出
Lisp教程
LISP - 數(shù)字
LISP - 循環(huán)
LISP - 常量
LISP - 集合
LISP - 字符
LISP - 程序結(jié)構(gòu)
LISP - 文件I/O
LISP - 哈希表
LISP - 宏
LISP - 數(shù)據(jù)類型
LISP - 包
LISP - 符號
LISP - 運(yùn)算符
LISP - 基本語法
LISP - 函數(shù)
LISP - 向量
LISP - 結(jié)構(gòu)
LISP - 概述介紹

LISP - 數(shù)組

LISP允許使用make-array函數(shù)來定義一個(gè)或多個(gè)維數(shù)組。一個(gè)數(shù)組可以任意LISP對象存儲(chǔ)為它的元素。

所有數(shù)組組成的連續(xù)的存儲(chǔ)單元。最低的地址對應(yīng)于第一個(gè)元素和最高地址的最后一個(gè)元素。

rank

數(shù)組的維數(shù)被稱為它的秩。

在LISP語言中,數(shù)組元素是由一個(gè)非負(fù)整數(shù)索引的順序指定。該序列的長度必須等于數(shù)組的秩。索引從0開始。

例如,要?jiǎng)?chuàng)建一個(gè)數(shù)組,10 - 單元格,命名為my-array,我們可以這樣寫:

(setf my-array (make-array '(10)))

aref 函數(shù)允許訪問該單元格的內(nèi)容。它有兩個(gè)參數(shù),數(shù)組名和索引值。

例如,要訪問的第十單元格的內(nèi)容,可以這樣編寫:

(aref my-array 9)

示例1

創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:

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

當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:

#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
#(25 23 45 10 20 17 25 19 67 30)

示例 2

讓我們創(chuàng)建一個(gè)3×3數(shù)組。

創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:

(setf x (make-array '(3 3) 
              :initial-contents '((0 1 2 ) (3 4 5) (6 7 8))))
(write x)

當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:

#2A((0 1 2) (3 4 5) (6 7 8))

示例 3

創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:

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

當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:

(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函數(shù)完整的語法

make-array函數(shù)需要許多其他的參數(shù)。讓我們來看看這個(gè)函數(shù)的完整語法:

make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-yiibaier  :displaced-to :displaced-index-offset

除了維度參數(shù),所有其他參數(shù)都是關(guān)鍵字。下表提供的參數(shù)簡要說明。

參數(shù) 描述
dimensions 它給該數(shù)組的大小。它是一個(gè)數(shù)字為一維數(shù)組,而對于多維數(shù)組列表。
:element-type 它是類型說明符,默認(rèn)值是T,即任何類型
:initial-element 初始元素值。它將使一個(gè)數(shù)組的所有初始化為一個(gè)特定值的元素。
:initial-content 初始內(nèi)容作為對象。
:adjustable 它有助于創(chuàng)造一個(gè)可調(diào)整大小(或可調(diào))向量,其底層的內(nèi)存可以調(diào)整大小。該參數(shù)是一個(gè)布爾值,表示數(shù)組是否可調(diào)與否,默認(rèn)值是nil。
:fill-yiibaier 它跟蹤實(shí)際存儲(chǔ)在一個(gè)可調(diào)整大小的矢量元素的數(shù)目
:displaced-to 它有助于創(chuàng)造一個(gè)移位的數(shù)組或共享數(shù)組共享其內(nèi)容與指定的數(shù)組。這兩個(gè)數(shù)組應(yīng)該有相同的元素類型。位移到選項(xiàng)可能無法使用:displaced-to或:initial-contents選項(xiàng)。此參數(shù)默認(rèn)為nil。
:displaced-index-offset 它給出了索引偏移創(chuàng)建的共享數(shù)組。

示例4

創(chuàng)建一個(gè)名為main.lisp一個(gè)新的源代碼文件,并在其中輸入如下代碼:

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

當(dāng)執(zhí)行以上代碼,它返回以下結(jié)果:

#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#(C 1 2 3)

若對數(shù)組是二維的:

(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