LISP - Pacotes

Em termos gerais de linguagens de programação, um pacote é projetado para fornecer uma maneira de manter um conjunto de nomes separado de outro. Os símbolos declarados em um pacote não entrarão em conflito com os mesmos símbolos declarados em outro. Desta forma, os pacotes reduzem os conflitos de nomenclatura entre módulos de código independentes.

O leitor LISP mantém uma tabela de todos os símbolos encontrados. Ao encontrar uma nova sequência de caracteres, ele cria um novo símbolo e o armazena na tabela de símbolos. Esta tabela é chamada de pacote.

O pacote atual é referido pela variável especial * pacote *.

Existem dois pacotes predefinidos no LISP -

  • common-lisp - contém símbolos para todas as funções e variáveis ​​definidas.

  • common-lisp-user- usa o pacote common-lisp e todos os outros pacotes com ferramentas de edição e depuração; é chamado cl-user em resumo

Funções de pacote em LISP

A tabela a seguir fornece as funções mais comumente usadas para criar, usar e manipular pacotes -

Sr. Não. Função e descrição
1

make-package nome do pacote e chave: apelidos: use

Ele cria e retorna um novo pacote com o nome de pacote especificado.

2

in-package nome do pacote e chave: apelidos: use

Torna o pacote atual.

3

in-package nome

Esta macro faz com que * pacote * seja definido como o pacote denominado nome, que deve ser um símbolo ou string.

4

find-package nome

Ele procura um pacote. O pacote com esse nome ou apelido é retornado; se tal pacote não existir, find-package retorna nil.

5

rename-package pacote new-name & new-nicknames opcionais

ele renomeia um pacote.

6

list-all-packages

Esta função retorna uma lista de todos os pacotes que existem atualmente no sistema Lisp.

7

delete-package pacote

Ele exclui um pacote.

Criando um Pacote LISP

o defpackagefunção é usada para criar um pacote definido pelo usuário. Possui a seguinte sintaxe -

(defpackage :package-name
   (:use :common-lisp ...)
   (:export :symbol1 :symbol2 ...)
)

Onde,

  • nome-do-pacote é o nome do pacote.

  • A palavra-chave: use especifica os pacotes de que este pacote precisa, ou seja, pacotes que definem funções usadas pelo código neste pacote.

  • A palavra-chave: export especifica os símbolos que são externos neste pacote.

o make-packagefunção também é usada para criar um pacote. A sintaxe para esta função é -

make-package package-name &key :nicknames :use

Os argumentos e palavras-chave têm o mesmo significado de antes.

Usando um Pacote

Depois de criar um pacote, você pode usar o código neste pacote, tornando-o o pacote atual. oin-package macro torna um pacote atual no ambiente.

Exemplo

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

(make-package :tom)
(make-package :dick)
(make-package :harry)
(in-package tom)
(defun hello () 
   (write-line "Hello! This is Tom's Tutorials Point")
)

(hello)
(in-package dick)
(defun hello () 
   (write-line "Hello! This is Dick's Tutorials Point")
)

(hello)
(in-package harry)
(defun hello () 
   (write-line "Hello! This is Harry's Tutorials Point")
)

(hello)
(in-package tom)
(hello)
(in-package dick)
(hello)
(in-package harry)
(hello)

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

Hello! This is Tom's Tutorials Point
Hello! This is Dick's Tutorials Point
Hello! This is Harry's Tutorials Point

Excluindo um Pacote

o delete-packagemacro permite que você apague um pacote. O exemplo a seguir demonstra isso -

Exemplo

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

(make-package :tom)
(make-package :dick)
(make-package :harry)
(in-package tom)
(defun hello () 
   (write-line "Hello! This is Tom's Tutorials Point")
)

(in-package dick)
(defun hello () 
   (write-line "Hello! This is Dick's Tutorials Point")
)

(in-package harry)
(defun hello () 
   (write-line "Hello! This is Harry's Tutorials Point")
)

(in-package tom)
(hello)
(in-package dick)
(hello)
(in-package harry)
(hello)
(delete-package tom)
(in-package tom)
(hello)

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

Hello! This is Tom's Tutorials Point
Hello! This is Dick's Tutorials Point
Hello! This is Harry's Tutorials Point
*** - EVAL: variable TOM has no value