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)