Как я могу использовать один файл из моего проекта в другом файле?

Простой вопрос. Я новичок в Clojure.

Как я могу использовать один файл из моего проекта в другом файле? В основном, как я могу включить, импортировать или потребовать другой файл? Не из библиотек, а из моего собственного кода.

Спасибо, Alex

Ответ 1

Обычно вам нужно использовать тот же метод, который вы используете с кодом библиотеки, который находится в use/require ваших пространствах имен (через форму ns в верхней части файла, а иногда и в use/require на REPL). Чтобы это работало, вы должны убедиться, что они находятся на пути к классам. Краткое руководство к этому:

  • Следуйте обычной структуре проекта Clojure: каталог src/, содержащий все исходные файлы, где файл src/foo/bar/baz.clj определяет пространство имен с именем foo.bar.baz. Обратите внимание, что вы должны поддерживать структуру структуры каталога/пространства имен; вещи не будут работать иначе. Также обратите внимание, что вы не должны использовать символ _ в именах пространств имен или символ - (дефис) в именах файлов, и всякий раз, когда вы используете _ в именах файлов, вы должны использовать - в именах пространства имен (а другой путь.) И, наконец, иерархия каталогов будет немного сложнее с проектами Maven, но не беспокойтесь об этом пока (если вы уже не опытный пользователь Maven, и в этом случае это не будет проблемой для вы).

    Также см. этот мой ответ более раннему SO-вопросу о обработке классов Java-классов с помощью Clojure для более подробного поэтапного объяснения иерархии файловой системы /classpath.

  • Если ваш код из пространства имен foo.bar должен использовать код из пространства имен foo.quux.baz, сделайте что-то вроде (ns foo.bar (:require [foo.quux.baz :as baz])) в foo/bar.clj и вызовите функции из baz как baz/some-function. Или вы можете поместить (:use foo.quux.baz) в форму ns вместо этого, чтобы называть их напрямую (без определителя пространства имен, например some-function). Это то же самое, что и для библиотечного кода.

При работе с кодом проекта из REPL убедитесь, что вы указали каталог src/ (сам каталог, а не какие-либо файлы в нем) в пути к классам. Вероятно, вам следует рассмотреть возможность использования некоторый инструмент для автоматизации настройки REPL (включая управление путями) для вас; Leiningen очень популярен среди Clojurians, и есть плагины для использования Maven с Clojure тоже.

Предупреждение: Ваша команда запуска JVM может (на самом деле, вероятно, будет) распознавать переменную среды, называемую $CLASSPATH. Что касается его отношения к вашим проектам Clojure, ну, в принципе их не должно быть. Скорее всего, вашим проектам потребуется другой путь к классам, причем некоторые из них могут использовать версии определенных банок, несовместимые с теми, которые требуются другим (особенно если вы используете Clojure 1.1 - последний стабильный выпуск - для некоторых проектов, экспериментируя с 1.2 снимками с другими). Таким образом, правильный способ управления classpath - подготовить минимальную версию для каждого проекта и передать ее команде запуска JVM. Как уже упоминалось ранее, вы должны потратить некоторое время на обучение использованию хорошего инструмента (например, вышеупомянутого Leiningen), чтобы как можно скорее настроить путь к классу, чтобы вам не нужно было об этом заботиться.

(В качестве побочного примечания в некоторых сценариях вам может потребоваться добавить больше, чем просто каталог src/ и ваш jar в путь к классам, например, если вы планируете вызывать compile для создания файлов .class вам также придется поместить целевой каталог в путь к классам. Это выходит за рамки этого вопроса.)

Кстати, я начал этот ответ со словом "обычно", потому что вы могли также использовать такие вещи, как load и in-ns, чтобы разделить одно пространство имен на несколько файлов. В большинстве случаев это не то, что вы действительно хотите сделать; просто используйте хорошо продуманный формат пространства имен.