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