-
common-lisp
Пакет с именем common-lisp
содержит базовые элементы системы ANSI Common Lisp. Его
внешние символы включают все видимые пользователю функции
и глобальные переменные, которые представлены в ANSI Common
Lisp системе, такие как car, cdr и *package*. Следует однако
отметить, что домашним пакетом этих символов не обязательно
должен является пакет common-lisp (для символов, например
t и lambda будет проще быть доступными и в common-lisp,
и в другом пакете, возможно с именем lisp FIXME). Почти все
другие пакеты должны использовать common-lisp, таким образом
эти символы будут доступны без использования полного имени (с
двоеточием). Данный пакет имеет псевдоним cl.
-
common-lisp-user
Пакет common-lisp-user является, по-умолчанию,
текущим пакетом во время запуска ANSI Common Lisp системы.
Этот пакет использует пакет common-lisp и имеет псевдоним
cl-user. В зависимости от реализации он также может содержать
другие символы и использовать платформоспецифичные пакеты.
-
keyword
Этот пакет содержит все ключевые символы, используемые
встроенными или пользовательскими Lisp’овыми функциями. Имя
символа, начинающегося с двоеточия, интерпретируется, как
ссылка на символ из этого пакета, который всегда является
внешним. Все символы в этом пакете является константами,
которые вычисляются сами в себя, поэтому пользователь может
записывать :foo вместо ’:foo.
Пользовательские программы не могут выполнять следующие действия,
которые могут противоречить базовому функционалу или негативно с ним
взаимодействовать. Если над символом в пакете common-lisp совершается
одно из действий ниже, за исключением явных указаний в книге, последствия
не определены.
- связывание или изменение значения символа (лексически или
динамически)
- определение или связывания символа с функцией
- определение или связывания символа с макросом
- определение его как спецификатора типа (defstruct, defclass,
deftype)
- определение его как структуры (defstruct)
- определение его как декларации
- определение его макроса символа
- изменение имени символа
- изменение пакета символа
- трассировка символа
- декларация или прокламация символа как специального или
лексического
- декларация или прокламация типа символа (type, ftype)
- удаление символа из пакета common-lisp
- определение как макроса компилятора
Если такой символ не определён глобально как переменная или
константа, пользовательская программа может связывать его лексически и
декларировать тип type данного связывания.
Если такой символ не определён как функция, макрос или оператор,
пользовательская программа может лексически связать символ с функцией,
декларировать тип ftype данного связывания и трассировать это
связывание.
Если такой символ не определён как функция, макрос или оператор,
пользовательская программа может лексически связать символ с
макросом.
В качестве примера, поведение данного фрагмента кода
(flet ((open (filename &key direction)
(format t "~%Была вызвана функция open.")
(open filename :direction direction)))
(with-open-file (x "frob" :direction ’:output)
(format t "~%Была ли вызвана open?")))
не определено. Даже в «разумной» реализации, например, раскрытие
макроса with-open-file должно ссылаться на функцию open. Тем не менее,
предшествующие правила определяют является ли реализация «разумной».
Данный фрагмент кода нарушает правила. Официально его поведение, таким
образом, полностью не определено, и точка.
Следует отметить, что «изменение списка свойств» не входит в список
упомянутых действий, таким образом пользовательская программа
может добавлять или удалять свойства для символов в common-lisp
пакете.