LISP - Pakiety
Ogólnie rzecz biorąc, pakiet jest zaprojektowany w celu zapewnienia sposobu na oddzielenie jednego zestawu nazw od drugiego. Symbole zadeklarowane w jednym pakiecie nie będą kolidować z tymi samymi symbolami zadeklarowanymi w innym. W ten sposób pakiety zmniejszają konflikty nazw między niezależnymi modułami kodu.
Czytnik LISP przechowuje tabelę wszystkich znalezionych symboli. Kiedy znajdzie nową sekwencję znaków, tworzy nowy symbol i przechowuje w tablicy symboli. Ta tabela nazywa się pakietem.
Bieżący pakiet jest określany przez specjalną zmienną * pakiet *.
W LISP są dwa predefiniowane pakiety -
common-lisp - zawiera symbole wszystkich zdefiniowanych funkcji i zmiennych.
common-lisp-user- używa pakietu common-lisp i wszystkich innych pakietów z narzędziami do edycji i debugowania; w skrócie nazywa się to cl-user
Funkcje pakietu w LISP
Poniższa tabela zawiera najczęściej używane funkcje używane do tworzenia, używania i manipulowania pakietami -
Sr.No. | Funkcja i opis |
---|---|
1 | make-package nazwa-pakietu i klucz: pseudonimy: użyj Tworzy i zwraca nowy pakiet o określonej nazwie pakietu. |
2 | in-package nazwa-pakietu i klucz: pseudonimy: użyj Sprawia, że pakiet jest aktualny. |
3 | in-package Nazwa To makro powoduje, że * pakiet * jest ustawiany na nazwę pakietu, która musi być symbolem lub łańcuchem. |
4 |
find-package Nazwa Wyszukuje pakiet. Zwracany jest pakiet o tej nazwie lub pseudonimie; jeśli taki pakiet nie istnieje, find-pakiet zwraca nil. |
5 |
rename-package pakiet nowa-nazwa i opcjonalne nowe-pseudonimy zmienia nazwę pakietu. |
6 |
list-all-packages Ta funkcja zwraca listę wszystkich pakietów, które obecnie istnieją w systemie Lisp. |
7 |
delete-package pakiet Usuwa pakiet. |
Tworzenie pakietu LISP
Plik defpackageFunkcja służy do tworzenia pakietu zdefiniowanego przez użytkownika. Ma następującą składnię -
(defpackage :package-name
(:use :common-lisp ...)
(:export :symbol1 :symbol2 ...)
)
Gdzie,
nazwa-pakietu to nazwa pakietu.
Słowo kluczowe: use określa pakiety, których potrzebuje ten pakiet, tj. Pakiety definiujące funkcje używane przez kod w tym pakiecie.
Słowo kluczowe: export określa symbole, które są zewnętrzne w tym pakiecie.
Plik make-packagefunkcja służy również do tworzenia pakietu. Składnia tej funkcji to -
make-package package-name &key :nicknames :use
Argumenty i słowa kluczowe mają takie samo znaczenie jak poprzednio.
Korzystanie z pakietu
Po utworzeniu pakietu możesz użyć kodu z tego pakietu, ustawiając go jako pakiet bieżący. Plikin-package makro sprawia, że pakiet jest aktualny w środowisku.
Przykład
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(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)
Po wykonaniu kodu zwraca następujący wynik -
Hello! This is Tom's Tutorials Point
Hello! This is Dick's Tutorials Point
Hello! This is Harry's Tutorials Point
Usuwanie pakietu
Plik delete-packagemakro umożliwia usunięcie pakietu. Poniższy przykład demonstruje to -
Przykład
Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.
(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)
Po wykonaniu kodu zwraca następujący wynik -
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