上一节:
下一节:

  LISP - 结构

  • 简述

    结构是用户定义的数据类型之一,它允许您组合不同种类的数据项。
    结构用于表示记录。假设您想在图书馆跟踪您的书籍。您可能想要跟踪每本书的以下属性 -
    • title
    • author
    • subject
    • book-id
  • 定义结构

    defstructLISP 中的宏允许您定义一个抽象的记录结构。defstruct语句定义了一种新的数据类型,为您的程序提供了多个成员。
    讨论格式defstruct宏,让我们写下 Book 结构的定义。我们可以将书籍结构定义为 -
    
    (defstruct book 
       title 
       author 
       subject 
       book-id 
    )
    

    请注意

    • 上面的声明创建了一个 book 结构,有四个named components.所以创建的每一本书都将是这个结构的一个对象。
    • 它定义了四个函数,名为 book-title、book-author、book-subject 和 book-book-id,它们将接受一个参数,一个书籍结构,并将返回书籍的标题、作者、主题和 book-id 字段目的。这些函数称为access functions.
    • 符号书成为一种数据类型,您可以使用typep谓词。
    • 还将有一个名为book-p,这是一个谓词,如果它的论点是一本书则为真,否则为假。
    • 另一个隐式函数名为make-book将被创建,这是一个constructor,调用时,将创建一个包含四个组件的数据结构,适用于访问函数。
    • #S syntax指的是一个结构,你可以用它来阅读或打印一本书的实例。
    • 还定义了一个名为 copy-book of one argument 的隐式函数。它获取一个书对象并创建另一个书对象,它是第一个书对象的副本。这个函数称为copier function.
    • 您可以使用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 Moo" 
       :subject "C-Programming Tutorial"
       :book-id "478")
    )
    ( setq book2 (make-book :title "Telecom Billing"
       :author "Alex Moo" 
       :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 Moo" :SUBJECT "C-Programming Tutorial" :BOOK-ID "478")
    #S(BOOK :TITLE "Telecom Billing" :AUTHOR "Alex Moo" :SUBJECT "C-Programming Tutorial" :BOOK-ID "501")
    #S(BOOK :TITLE "C Programming" :AUTHOR "Nuha Moo" :SUBJECT "C-Programming Tutorial" :BOOK-ID 100)
    
上一节:
下一节: