LISP - Paquetes

En términos generales de lenguajes de programación, un paquete está diseñado para proporcionar una forma de mantener un conjunto de nombres separado de otro. Los símbolos declarados en un paquete no entrarán en conflicto con los mismos símbolos declarados en otro. De esta manera, los paquetes reducen los conflictos de nombres entre módulos de código independientes.

El lector LISP mantiene una tabla de todos los símbolos que ha encontrado. Cuando encuentra una nueva secuencia de caracteres, crea un nuevo símbolo y lo almacena en la tabla de símbolos. Esta tabla se llama paquete.

El paquete actual es referido por la variable especial * paquete *.

Hay dos paquetes predefinidos en LISP:

  • common-lisp - contiene símbolos para todas las funciones y variables definidas.

  • common-lisp-user- utiliza el paquete common-lisp y todos los demás paquetes con herramientas de edición y depuración; se llama cl-user en resumen

Funciones de paquete en LISP

La siguiente tabla proporciona las funciones más utilizadas para crear, usar y manipular paquetes:

No Señor. Función y descripción
1

make-package nombre y clave del paquete : apodos: use

Crea y devuelve un nuevo paquete con el nombre de paquete especificado.

2

in-package nombre y clave del paquete : apodos: use

Actualiza el paquete.

3

in-package nombre

Esta macro hace que * paquete * se establezca con el nombre del paquete, que debe ser un símbolo o una cadena.

4

find-package nombre

Busca un paquete. Se devuelve el paquete con ese nombre o apodo; si no existe tal paquete, find-package devuelve nil.

5

rename-package paquete nuevo-nombre y nuevos-apodos opcionales

cambia el nombre de un paquete.

6

list-all-packages

Esta función devuelve una lista de todos los paquetes que existen actualmente en el sistema Lisp.

7

delete-package paquete

Elimina un paquete.

Creación de un paquete LISP

los defpackageLa función se utiliza para crear un paquete definido por el usuario. Tiene la siguiente sintaxis:

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

Dónde,

  • nombre-paquete es el nombre del paquete.

  • La palabra clave: use especifica los paquetes que necesita este paquete, es decir, paquetes que definen funciones utilizadas por el código en este paquete.

  • La palabra clave: export especifica los símbolos que son externos en este paquete.

los make-packageLa función también se utiliza para crear un paquete. La sintaxis de esta función es:

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

Los argumentos y palabras clave tienen el mismo significado que antes.

Usando un paquete

Una vez que haya creado un paquete, puede usar el código en este paquete, convirtiéndolo en el paquete actual. losin-package macro hace que un paquete sea actual en el entorno.

Ejemplo

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

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

Cuando ejecuta el código, devuelve el siguiente resultado:

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

Eliminar un paquete

los delete-packagemacro le permite eliminar un paquete. El siguiente ejemplo demuestra esto:

Ejemplo

Cree un nuevo archivo de código fuente llamado main.lisp y escriba el siguiente código en él.

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

Cuando ejecuta el código, devuelve el siguiente 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