Простой вопрос. Я новичок в Clojure.
Как я могу использовать один файл из моего проекта в другом файле? В основном, как я могу включить, импортировать или потребовать другой файл? Не из библиотек, а из моего собственного кода.
Спасибо, Alex
Простой вопрос. Я новичок в Clojure.
Как я могу использовать один файл из моего проекта в другом файле? В основном, как я могу включить, импортировать или потребовать другой файл? Не из библиотек, а из моего собственного кода.
Спасибо, Alex
Обычно вам нужно использовать тот же метод, который вы используете с кодом библиотеки, который находится в 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
, чтобы разделить одно пространство имен на несколько файлов. В большинстве случаев это не то, что вы действительно хотите сделать; просто используйте хорошо продуманный формат пространства имен.