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