Пример ниже приведен в ANSI Common Lisp Пола Грэхама как пример выполнения инкапсуляции:
(defpackage "CTR"
(:use "COMMON-LISP")
(:export "COUNTER" "INCREMENT" "CLEAR"))
(in-package ctr)
;function definitions here
Однако в «Практическом общем лиспере» Питера Сейбельса, ссылка здесь , он говорит:
Поскольку пакеты используются программой чтения, пакет должен быть определен
прежде чем вы сможете загрузить или скомпилировать файл, содержащий IN-PACKAGE
выражение переключается на этот пакет. Пакеты также должны быть определены
прежде чем другие формы DEFPACKAGE могут ссылаться на них ...
Лучший первый шаг к тому, чтобы убедиться, что пакеты существуют, когда им нужно
чтобы поместить все ваши файлы DEFPACKAGE в файлы отдельно от кода, который
нужно читать в этих пакетах
Поэтому он рекомендует создавать два файла для каждого пакета, один для defpackage и один для кода. Файлы, содержащие defpackages, должны начинаться с (в пакете "COMMON-LISP-USER").
Мне кажется, что помещение defpackage в один и тот же файл перед входным пакетом и кодом - хороший способ убедиться, что пакет определен перед использованием. Таким образом, первый способ - собрать все в один файл - кажется проще. Есть ли проблемы с использованием этого метода для создания пакета?