Lisp-structures

提供:Dev Guides
移動先:案内検索

LISP-構造

構造はユーザー定義のデータ型の1つであり、異なる種類のデータ項目を組み合わせることができます。

構造は、レコードを表すために使用されます。 図書館で本を追跡したいとします。 あなたは、各本に関する次の属性を追跡することができます-

  • タイトル
  • 著者
  • 件名
  • ブックID

構造の定義

LISPの defstruct マクロを使用すると、抽象レコード構造を定義できます。 defstruct ステートメントは、プログラムに複数のメンバーを持つ新しいデータ型を定義します。

*defstruct* マクロの形式について説明するために、Book構造の定義を記述しましょう。 本の構造を次のように定義できます-
(defstruct book
   title
   author
   subject
   book-id
)

ご注意ください

  • 上記の宣言は、4つの*名前付きコンポーネント*を含むブック構造を作成します。したがって、作成されるすべてのブックはこの構造のオブジェクトになります。
  • book-title、book-author、book-subject、book-book-idという名前の4つの関数を定義します。これらは1つの引数、ブック構造を取り、フィールドのタイトル、著者、サブジェクト、ブックのbook-idを返します。オブジェクト。 これらの関数は*アクセス関数*と呼ばれます。
  • シンボルブックはデータ型になり、 typep 述語を使用して確認できます。
  • また、* book-pという名前の暗黙的な関数もあります。これは述語であり、引数が本の場合はtrue、それ以外の場合はfalseです。
  • make-book という名前の別の暗黙関数が作成されます。これは、呼び出されると、アクセス関数での使用に適した4つのコンポーネントを持つデータ構造を作成する constructor です。
  • *#S構文*は構造を指し、それを使用して本のインスタンスを読んだり印刷したりできます。
  • 1つの引数の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 100)