LISP - Pacchetti

In termini generali di linguaggi di programmazione, un pacchetto è progettato per fornire un modo per mantenere un insieme di nomi separato da un altro. I simboli dichiarati in un pacchetto non entreranno in conflitto con gli stessi simboli dichiarati in un altro. In questo modo i pacchetti riducono i conflitti di denominazione tra moduli di codice indipendenti.

Il lettore LISP mantiene una tabella di tutti i simboli che ha trovato. Quando trova una nuova sequenza di caratteri, crea un nuovo simbolo e lo memorizza nella tabella dei simboli. Questa tabella è chiamata pacchetto.

Il pacchetto corrente è indicato dalla variabile speciale * pacchetto *.

Ci sono due pacchetti predefiniti in LISP:

  • common-lisp - contiene simboli per tutte le funzioni e variabili definite.

  • common-lisp-user- utilizza il pacchetto common-lisp e tutti gli altri pacchetti con strumenti di modifica e debug; si chiama in breve cl-user

Funzioni del pacchetto in LISP

La tabella seguente fornisce le funzioni usate più comunemente per creare, usare e manipolare i pacchetti:

Sr.No. Funzione e descrizione
1

make-package nome-pacchetto e chiave: soprannomi: usa

Crea e restituisce un nuovo pacchetto con il nome del pacchetto specificato.

2

in-package nome-pacchetto e chiave: soprannomi: usa

Rende il pacchetto attuale.

3

in-package nome

Questa macro fa sì che * pacchetto * venga impostato sul pacchetto denominato nome, che deve essere un simbolo o una stringa.

4

find-package nome

Cerca un pacchetto. Viene restituito il pacchetto con quel nome o nickname; se non esiste un tale pacchetto, find-package restituisce nil.

5

rename-package pacchetto nuovo-nome e nuovi-soprannomi opzionali

rinomina un pacchetto.

6

list-all-packages

Questa funzione restituisce un elenco di tutti i pacchetti attualmente esistenti nel sistema Lisp.

7

delete-package pacchetto

Elimina un pacchetto.

Creazione di un pacchetto LISP

Il defpackageviene utilizzata per creare un pacchetto definito dall'utente. Ha la seguente sintassi:

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

Dove,

  • nome-pacchetto è il nome del pacchetto.

  • La parola chiave: use specifica i pacchetti di cui ha bisogno questo pacchetto, cioè i pacchetti che definiscono le funzioni usate dal codice in questo pacchetto.

  • La parola chiave: export specifica i simboli esterni in questo pacchetto.

Il make-packageviene utilizzata anche per creare un pacchetto. La sintassi per questa funzione è:

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

Gli argomenti e le parole chiave hanno lo stesso significato di prima.

Utilizzo di un pacchetto

Dopo aver creato un pacchetto, è possibile utilizzare il codice in questo pacchetto, rendendolo il pacchetto corrente. Ilin-package macro rende un pacchetto corrente nell'ambiente.

Esempio

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.

(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 esegui il codice, restituisce il seguente risultato:

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

Eliminazione di un pacchetto

Il delete-packagemacro consente di eliminare un pacchetto. Il seguente esempio lo dimostra:

Esempio

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.

(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 esegui il codice, restituisce il seguente risultato:

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