跳轉到內容

通用 Lisp/參考/defstruct

來自華夏公益教科書,開放的書籍,為了一個開放的世界

defstruct 構造聲明瞭一個新的使用者定義資料型別,該型別具有固定數量的命名元件。它還建立結構建構函式。

以下示例[1] 聲明瞭一個帶有符號 point 的 Lisp 結構,以及三個由符號 xyz 引用的槽。這裡的建構函式名為 make-point

(defstruct point x y z) ; define structure

(defvar my-point) ; define var 

(setf my-point (make-point :x 3 :y 4 :z 12)) ;  set value of slots of var 

(point-x my-point) ; access to slots
;; объявление и инициализация структуры (initiating of structure)
(defstruct 3dpoint (x 0) (y 0) (z 0));

;; обязательно превращем все это в динамическую переменную
(defvar *my-points* (make-array '(1000000) :element-type '3dpoint))

;; получение случайного числа  (get random number from interval)
(defun random-from-range (start end)
(+ start (random (+ 1 (- end start)))))

;; функция заполнения массива структур (set values in array of structures)
(defun setf-my-points (*my-points*)
	(declare (special *my-points*))
	(loop for i from 1 to 1000000 do
		(progn 
		      (print i)
		      (setf (aref *my-points* i) 
		      (make-3dpoint :x (random-from-range 1 100) 
				    :y (random-from-range 100 200) 
				    :z (random-from-range 300 400)))     
		)
	)
)

;; заполняем случайными значениями 1 (call function that set value in array of structures)
(print (time (setf-my-points *my-points*)))

;; получаем доступ к случайному значению (1 1000000) access to random ID record 
(3dpoint-x (aref *my-points* (random-from-range 1 1000000)))

;; смотрим время доступа... (see time)
(print (time (3dpoint-x (aref *my-points* (random-from-range 1 1000000)))))

參考文獻

[編輯 | 編輯原始碼]
  1. CLOS 基礎知識,作者:尼克·萊文,雷文布魯克有限公司,2003 年 7 月 15 日
華夏公益教科書