Лучше ли помещать defpackage в отдельный файл при создании пакетов? - PullRequest
9 голосов
/ 07 декабря 2011

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

Ответы [ 3 ]

9 голосов
/ 07 декабря 2011

Я думаю, что использование отдельного файла для defpackage - хорошая привычка, потому что:

  • Вы не «загрязняете» свои файлы с помощью defpackage.
  • Itоблегчает поиск экспортированных / затененных / ... символов, вы знаете, что вам просто нужно посмотреть на package.lisp.
  • Вам не нужно беспокоиться о порядке, когда вы используете ASDF.

    (defsystem :your-system
      :components ((:file "package")
                   ... the rest ...))`
    
  • Питер Сейбел так говорит;)

РЕДАКТИРОВАТЬ: я забыл упомянуть quickproject, который облегчает создание нового CLпроекты.

REPL> (quickproject:make-project "~/src/lisp/my-wonderful-project/"
                                 :depends-on '(drakma cl-ppcre local-time))`

Эта команда создаст каталог "~/src/lisp/my-wonderful-project/" и следующие файлы:

  • package.lisp
  • my-wonderful-project.asd (filled)
  • my-wonderful-project.lisp
  • README.txt

И, таким образом, я думаю, что хорошо использовать то же соглашение.

1 голос
/ 07 декабря 2011

Я склонен использовать несколько файлов исходного кода, один файл "packages.lisp" и отдельный файл определения системы "project.asd" для большинства моих проектов.Если проекту требуется несколько пакетов, все они определены в "packages.lisp", с экспортируемым соответствующим экспортом на месте.

0 голосов
/ 02 декабря 2014

Существует причина для размещения DEFPACKAGE в своем собственном файле: если у вас большой пакет, у вас может быть несколько групп связанных функций, и вы можете захотеть иметь отдельные исходные файлы для каждой группы функций. Тогда все исходные файлы будут иметь свой собственный IN-PACKAGE в верхней части, но все они будут «делиться» внешним DEFPACKAGE. Затем, пока вы загружаете DEFPACKAGE в первую очередь, не имеет значения, в каком порядке вы загружаете другие исходные файлы.

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

...