LISP - 結構

結構是用戶定義的數據類型,它讓用戶可以合併不同種類的數據項。

結構被用於表示記錄。假設要跟蹤圖書館中的書籍。可能希望跟蹤瞭解每本書的以下屬性:

  • 標題 - 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