LISP - Estruturas

As estruturas são um tipo de dados definido pelo usuário, o que permite combinar itens de dados de diferentes tipos.

As estruturas são usadas para representar um registro. Suponha que você queira manter o controle de seus livros em uma biblioteca. Você pode querer rastrear os seguintes atributos sobre cada livro -

  • Title
  • Author
  • Subject
  • ID do livro

Definindo uma Estrutura

o defstructmacro no LISP permite que você defina uma estrutura de registro abstrata. odefstruct declaração define um novo tipo de dados, com mais de um membro para seu programa.

Para discutir o formato do defstructmacro, vamos escrever a definição da estrutura do livro. Podemos definir a estrutura do livro como -

(defstruct book 
   title 
   author 
   subject 
   book-id 
)

Observe

  • A declaração acima cria uma estrutura de livro com quatro named components. Portanto, todo livro criado será um objeto dessa estrutura.

  • Ele define quatro funções chamadas book-title, book-author, book-subject e book-book-id, que terá um argumento, uma estrutura de livro, e retornará os campos título, autor, assunto e book-id do livro objeto. Essas funções são chamadas deaccess functions.

  • O livro de símbolos se torna um tipo de dados e você pode verificá-lo usando o typep predicado.

  • Haverá também uma função implícita chamada book-p, que é um predicado e será verdadeiro se seu argumento for um livro e falso caso contrário.

  • Outra função implícita chamada make-book será criado, o que é um constructor, que, quando chamado, criará uma estrutura de dados com quatro componentes, adequada para uso com as funções de acesso.

  • o #S syntax refere-se a uma estrutura, e você pode usá-la para ler ou imprimir instâncias de um livro.

  • Uma função implícita chamada copybook de um argumento também é definida como isso. Ele pega um objeto de livro e cria outro objeto de livro, que é uma cópia do primeiro. Esta função é chamada decopier function.

  • Você pode usar setf para alterar os componentes de um livro, por exemplo

(setf (book-book-id book3) 100)

Exemplo

Crie um novo arquivo de código-fonte denominado main.lisp e digite o seguinte código nele.

(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)

Quando você executa o código, ele retorna o seguinte resultado -

#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)