11.2 Имена пакетов

Каждый пакет имеет имя (строку) и, возможно, несколько псевдонимов. Они указываются при создании пакета, и могут быть изменены позднее. Имя пакета должно быть длинным и информативным, например editor. Псевдоним должен быть коротким и простым в написании, например ed.

Для имен пакетов существует только одно пространство имён. Функция find-package транслирует имя или псевдоним пакета в объект пакета. Функция package-name возвращает имя пакета. Функция package-nicknames возвращает список всех псевдонимов для пакета. Функция rename-package заменяет текущее имя пакета и псевдонимы на указанные пользователем. Переименование пакета редко бывает полезным, но один из случаев, например, для разработки, когда необходимо загрузить две версии одного пакета в Lisp систему. Можно загрузить первую версию, переименовать её, и затем загрузить другую версию, без разрешения конфликтов имён.

Когда Lisp’овый считыватель встречает полное имя символа, он обрабатывает часть имени пакета, также как и часть имени символа, возводя все неэкранированные буквы в верхний регистр. Экранирование букв производится с помощью символов \ или |. Поиск, осуществляемый функцией find-package, является регистрозависимым, также как и для символов. Следует отметить, что |Foo|:|Bar| ссылается на символ, имя которого Bar, в пакете Foo. Для сравнения |Foo:Bar| ссылается на семизначный символ, имя которого содержит двоеточие (а также две заглавные и четыре прописные буквы) и символ принадлежит текущему пакету. В данной книге символы и пакеты указываются без экранирования строковыми символами только в нижнем регистре, при этом внутри Lisp машины они будут переведены в верхний регистр.

Большинство функций, которые принимают имя пакета, могут принимать или символ, или строку. Если указан символ, то используется его имя, которое подвергается обычным преобразованиям в верхний регистр. Если указана строка, то она должна быть заранее преобразована для полного совпадения с именем пакета.

X3J13 voted in January 1989 to clarify that one may use either a package object or a package name (symbol or string) in any of the following situations:

Note that the first argument to make-package must still be a package name and not an actual package; it makes no sense to create an already existing package. Similarly, package nicknames must always be expressed as package names and not as package objects. If find-package is given a package object instead of a name, it simply returns that package.

В некоторых местах можно использовать как имя пакета (символ или строку), так и сам объект:

Заметьте, что первый аргумент для make-package должен быть именем пакета, а не самим пакетом, так как нет смысла создавать уже созданный пакет. Также и псевдонимы пакета не могут быть объектами пакета. Если find-package получает объект пакета, а не его имя, она просто возвращает этот объект.