11.6 Системные пакеты

Пользовательские программы не могут выполнять следующие действия, которые могут противоречить базовому функционалу или негативно с ним взаимодействовать. Если над символом в пакете 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 пакете.