LISP - Símbolos

No LISP, um símbolo é um nome que representa objetos de dados e, curiosamente, também é um objeto de dados.

O que torna os símbolos especiais é que eles têm um componente chamado property list, ou plist.

Listas de Propriedades

LISP permite atribuir propriedades aos símbolos. Por exemplo, vamos ter um objeto 'pessoa'. Gostaríamos que esse objeto 'pessoa' tivesse propriedades como nome, sexo, altura, peso, endereço, profissão, etc. Uma propriedade é como um nome de atributo.

Uma lista de propriedades é implementada como uma lista com um número par (possivelmente zero) de elementos. Cada par de elementos da lista constitui uma entrada; o primeiro item é oindicator, e o segundo é o value.

Quando um símbolo é criado, sua lista de propriedades está inicialmente vazia. As propriedades são criadas usandoget dentro de um setf Formato.

Por exemplo, as declarações a seguir nos permitem atribuir as propriedades título, autor e editora, e respectivos valores, a um objeto denominado (símbolo) 'livro'.

Exemplo 1

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

(write (setf (get 'books'title) '(Gone with the Wind)))
(terpri)
(write (setf (get 'books 'author) '(Margaret Michel)))
(terpri)
(write (setf (get 'books 'publisher) '(Warner Books)))

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

(GONE WITH THE WIND)
(MARGARET MICHEL)
(WARNER BOOKS)

Várias funções de lista de propriedades permitem atribuir propriedades, bem como recuperar, substituir ou remover as propriedades de um símbolo.

o getfunção retorna a lista de propriedades do símbolo para um determinado indicador. Possui a seguinte sintaxe -

get symbol indicator &optional default

o geta função procura a lista de propriedades do símbolo fornecido para o indicador especificado; se encontrado, retorna o valor correspondente; caso contrário, o padrão é retornado (ou nulo, se um valor padrão não for especificado).

Exemplo 2

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

(setf (get 'books 'title) '(Gone with the Wind))
(setf (get 'books 'author) '(Margaret Micheal))
(setf (get 'books 'publisher) '(Warner Books))

(write (get 'books 'title))
(terpri)
(write (get 'books 'author))
(terpri)
(write (get 'books 'publisher))

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

(GONE WITH THE WIND)
(MARGARET MICHEAL)
(WARNER BOOKS)

o symbol-plist função permite que você veja todas as propriedades de um símbolo.

Exemplo 3

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

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))

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

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)

o remprop função remove a propriedade especificada de um símbolo.

Exemplo 4

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

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))
(remprop 'annie 'age)
(terpri)
(write (symbol-plist 'annie))

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

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT)