LISP - 結構



結構是使用者定義的資料型別之一,允許您組合不同型別的資料項。

結構用於表示記錄。假設您想跟蹤圖書館中書籍的資訊。您可能希望跟蹤每本書的以下屬性:

  • 標題
  • 作者
  • 主題
  • 圖書 ID

定義結構

LISP 中的 **defstruct** 宏允許您定義抽象記錄結構。**defstruct** 語句定義了一種新的資料型別,為您的程式提供了多個成員。

為了討論 **defstruct** 宏的格式,讓我們編寫 Book 結構的定義。我們可以將 Book 結構定義為:

(defstruct book 
   title 
   author 
   subject 
   book-id 
)

請注意

  • 以上宣告建立了一個具有四個**命名元件**的 Book 結構。因此,建立的每一本書都將是此結構的物件。

  • 它定義了四個名為 book-title、book-author、book-subject 和 book-book-id 的函式,這些函式將接受一個引數(一個 Book 結構),並返回 Book 物件的 title、author、subject 和 book-id 欄位。這些函式稱為**訪問函式**。

  • 符號 book 成為一種資料型別,您可以使用 **typep** 謂詞檢查它。

  • 還將有一個名為 **book-p** 的隱式函式,它是一個謂詞,如果其引數是 Book 則為真,否則為假。

  • 另一個名為 **make-book** 的隱式函式將被建立,它是一個**建構函式**,當被呼叫時,它將建立一個具有四個元件的資料結構,適合與訪問函式一起使用。

  • **#S 語法**指的是結構,您可以使用它來讀取或列印 Book 的例項。

  • 還定義了一個名為 copy-book 的隱式函式,它接受一個引數。它接受一個 Book 物件並建立一個另一個 Book 物件,它是第一個物件的副本。此函式稱為**複製函式**。

  • 您可以使用 **setf** 來更改 Book 的元件,例如

(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 100)
廣告

© . All rights reserved.