LISP - Пакеты

В общем термине языков программирования, пакет предназначен для обеспечения возможности хранить один набор имен отдельно от другого. Символы, объявленные в одном пакете, не будут конфликтовать с такими же символами, объявленными в другом. Таким образом пакеты уменьшают конфликты именования между независимыми модулями кода.

Читатель LISP ведет таблицу всех найденных символов. Когда он находит новую последовательность символов, он создает новый символ и сохраняет его в таблице символов. Эта таблица называется пакетом.

На текущий пакет ссылается специальная переменная * package *.

В LISP есть два предопределенных пакета:

  • common-lisp - он содержит символы для всех определенных функций и переменных.

  • common-lisp-user- он использует пакет common-lisp и все другие пакеты с инструментами редактирования и отладки; сокращенно называется cl-user

Функции пакета в LISP

В следующей таблице представлены наиболее часто используемые функции, используемые для создания, использования и управления пакетами.

Sr. No. Функция и описание
1

make-package имя-пакета и ключ: псевдонимы: использовать

Он создает и возвращает новый пакет с указанным именем пакета.

2

in-package имя-пакета и ключ: псевдонимы: использовать

Делает пакет текущим.

3

in-package имя

Этот макрос заставляет * package * быть установленным для пакета с именем name, которое должно быть символом или строкой.

4

find-package имя

Он ищет пакет. Пакет с таким именем или псевдонимом возвращается; если такого пакета не существует, find-package возвращает nil.

5

rename-package пакет новое-имя и необязательные новые-никнеймы

он переименовывает пакет.

6

list-all-packages

Эта функция возвращает список всех пакетов, которые в настоящее время существуют в системе Lisp.

7

delete-package пакет

Удаляет пакет.

Создание пакета LISP

В defpackageфункция используется для создания пользовательского пакета. Он имеет следующий синтаксис -

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

Где,

  • package-name - это имя пакета.

  • Ключевое слово: use определяет пакеты, которые нужны этому пакету, т. Е. Пакеты, которые определяют функции, используемые кодом в этом пакете.

  • Ключевое слово: export определяет символы, которые являются внешними в этом пакете.

В make-packageфункция также используется для создания пакета. Синтаксис этой функции -

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

Аргументы и ключевые слова имеют то же значение, что и раньше.

Использование пакета

После создания пакета вы можете использовать код из этого пакета, сделав его текущим пакетом. Вin-package макрос делает пакет текущим в среде.

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

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

Когда вы выполняете код, он возвращает следующий результат -

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

Удаление пакета

В delete-packageмакрос позволяет удалить пакет. Следующий пример демонстрирует это -

пример

Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.

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

Когда вы выполняете код, он возвращает следующий результат -

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