結構是使用者定義的資料型別,它讓使用者可以合併不同種類的資料項。
結構被用於表示記錄。假設要跟蹤圖書館中的書籍。可能希望跟蹤了解每本書的以下屬性:
標題 - Title
作者 - Author
科目 - Subject
書籍編號 - Book ID
LISP的defstruct巨集允許定義一個抽象的記錄結構。defstruct語句定義了一個新的資料型別,專案結構中不止一個成員。
討論defstruct巨集的格式,編寫本書的結構的定義。可以定義本書的結構為:
(defstruct book title author subject book-id )
請注意:
上述宣告建立一個本書結構有四個命名元件。因此,建立的每一個本書將是這個結構的物件。
它定義了一個名為book-title,book-subject,book-book-id的書籍,這將需要一個引數,書的結構,並且將返回的欄位標題,作者,主題和本書的book-book-id物件。這些函式被稱為接入功能。
符號書成為一個資料型別,它可以使用typep謂詞檢查。
也將命名為book-p隱函式,這是一個謂詞,將為true,如果它的引數是本、書,則返回false。
另一個名為make-book 隱函式將被建立,這是一種構造方法,其中,當被呼叫時,將建立一個資料結構具有四個元件,適於與所述接入功能的使用。
#S語法指的是一個結構,可以用它來讀取或列印一本書的範例
copy-book書本引數還定義了隱函式。這需要書的物件,並建立另一個書的物件,這是第一個副本。呼叫此函式影印機功能。
可以使用setf改變書籍的組成結構,例如
(setf (book-book-id book3) 100)
範例
建立一個名為main.lisp一個新的原始碼檔案,並在其中輸入如下程式碼:
(defstruct book title author subject book-id ) ( setq book1 (make-book :title "C Programming" :author "Nuha Ali" :subject "C-Programming Tutorial" :book-id "478")) ( setq book2 (make-book :title "Telecom Billing" :author "Zara Ali" :subject "C-Programming Tutorial" :book-id "501")) (write book1) (terpri) (write book2) (setq book3( copy-book book1)) (setf (book-book-id book3) 100) (terpri) (write book3)
當執行程式碼,它返回以下結果:
#S(BOOK :TITLE "C Programming" :AUTHOR "Nuha Ali" :SUBJECT "C-Programming Tutorial" :BOOK-ID "478") #S(BOOK :TITLE "Telecom Billing" :AUTHOR "Zara Ali" :SUBJECT "C-Programming Tutorial" :BOOK-ID "501") #S(BOOK :TITLE "C Programming" :AUTHOR "Nuha Ali" :SUBJECT "C-Programming Tutorial" :BOOK-ID