ANSI Common Lisp譯本筆記3

特殊數據結構


數組


make-arry:構造一個數組,第一個參數爲數組維度,若要指定多維數組,則此參數爲一個列表。第二個參數爲初始化值,可以使用關鍵字initial-element來指定全部初始值。
如:(make-array 2 :initial-element nil)→(nil nil)一個一維數組含有兩個nil值的元素。
(make-array '(2 2) :initial-element nil)→((nil nil) (nil nil))一個二維數組含有兩個一維數組。


aref:根據下標取數組值。第一個參數爲數組,第二個參數爲下表。
如:(aref arr 0 0)表示:取出一個二維數組的第0行0列的元素。
(aref arr 1 2)表示:取出一個二維數組的第1行第2列的元素。


若要生成一個常量數組則用#na,其中n表示維度。
如:#2a((1 2) (3 4))表示:一個二維數組含有元素爲1 2 3 4


其中,一維數組又叫向量,從向量中取值有一個更快速的方法:svref。是專爲向量制定的。


若要生成一個常量向量則使用#。
如:#(1 2 3)表示一個一維數組,即向量。


字符與字符串


char-code:返回與字符相關的數字
code-char:返回與數字相關的字符


字符比較函數:char< char<= char= char> char>= char/=(不等於)


字符串可理解爲向量,所以序列和數組的函數,字符串都能使用,如:aref取出元素。
字符串專有取出元素函數:char:第一個參數爲字符串,第二個參數爲取出位置。
比較字符串通用方法爲:equal
string-equal:此函數忽略大小寫來比較字符串。
concatenate:可用來連接字符串。接受一個指定類型的符號,後面加上一個或多個序列。
如:(concarenate 'string "not" "to worry") → "not to worry"




序列
序列類型包含:列表和向量
所以,remove、length、subseq、reverse、sort、every、some都是序列函數。
取出序列元素的函數:nth(列表)、aref(數組)、svref(向量)、char(字符串)。
其中,還有一個elt,對任何種類的序列都有效。
elt:第一個參數是一個序列,第二個參數爲位置。返回指定位置的值。
如:(elt '(a b c) 2) → c


序列函數關鍵字


參數 用途 缺省
:key 應用至每個元素的函數 identity
:test 作來比較的函數 eql
:from-end 若爲真,反向工作 nil
:start 起始位置 0
:end 若給定,結束位置 nil


一個可以接受上述的全部關鍵字的函數:position
position:返回序列中一個元素的位置,未找到時,返回nil。

結構


defstruct:定義一個結構。第一個參數是結構的名字,後續參數爲結構的字段名。同時還隱式的定義了make-結構名、結構名-p、copy-結構名、結構-結構字段名。


make-結構名:是用來創建一個結構變量
結構名-p:是判斷一個變量是否是此結構
copy-結構名:複製結構變量的值
結構名-結構字段名:取出結構變量中的指定字段。


如:(defsruct point x y)→定義一個點結構,有兩個字段名:x、y
(setf p (make-point :x 1 :y 1)→創建要給點結構的變量,並將字段x、y賦值爲1 
(point-p p)→判斷變量p是否爲點結構,是返回T,否返回nil
(setf temp (copy-point p))→複製p的值並將此值設置給temp,即temp和p相等,也是一個點結構
(point-x p)→取出結構p的字段x
(point-y p)→取出結構p的字段y


還可以,在本來的定義中,附上一個含有字段名及要給預設表達式的列表,來指定結構字段的缺省值。即:在創建結構的時候,給結構加上缺省值。當調用make-結構名,指定初始值時則使用缺省值。
如:(defstruct point (x 0) (y 0))


其中,使用:conc-name參數制定了要放在字段前面的名字,並用這些名字來生成存取函數。
即:conc-name是用來制定結構字段存取函數前綴。默認爲結構名-。如:point-x 若制定:conc-name p則爲px
使用例子:(defstruct (point (:conc-name p)) x y),則字段x、y的存取函數爲px、py而不是point-x、point-y


:print-function:在結構需要被顯示時,要用來打印的函數名。即:使用make-結構名,可打印出缺省值。
例子:(defstruct (point (:conc-name p) (:print-function print-point) (x 1) (y 2))
(defun print-point (p stream depth)
  (format stream "<~A,~A>") (px x) (py y)))
在控制檯輸入:(make-point)
顯示:<1,2>
其中,:print-function後面的函數名可以自定義,但是此函數的參數列表一定爲三個
發佈了79 篇原創文章 · 獲贊 20 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章