Простой вопрос. Я плохо знаком с Clojure.
Как я могу использовать один файл из своего проекта в другом файле? В основном, как я могу включать, импортируйте или потребуйте другого файла? Не из библиотек, но fro мой собственный код.
Спасибо, Alex
Обычно вы хотите использовать тот же метод, который вы используете с кодом библиотеки, который заключается в использовании
/ требует
ваших пространств имен (через нс
форма в верхней части файла и иногда использование
/ требует
функций в REPL). Чтобы это сработало, вы должны убедиться, что они находятся в пути к классам. Краткое руководство по этому поводу:
Следуйте обычной структуре проекта Clojure: каталог src /
, содержащий все ваши исходные файлы, где файл src / foo / bar / baz.clj
определяет пространство имен foo.bar.baz
. Обратите внимание, что вы должны поддерживать соответствие структуры каталогов / структуры имен пространства имен; иначе ничего не получится. Также обратите внимание, что вы не должны использовать символ _
в именах пространств имен или символы -
(дефис) в именах файлов и всякий раз, когда вы используете _
в именах файлов вы должны использовать -
в именах пространств имен (и наоборот). Наконец, иерархия каталогов будет немного сложнее с проектами Maven, но пока не беспокойтесь об этом ( если вы уже не являетесь опытным пользователем Maven, и в этом случае для вас это не будет проблемой).
Также см. этот мой ответ на более ранний вопрос SO об обработке пути к классам Java с помощью Clojure для более подробного пошагового объяснения соответствия иерархии файловой системы / иерархии пути к классам.
Если ваш код из 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, ну, в принципе, их не должно быть. Скорее всего, для каждого из ваших проектов потребуется другой путь к классам, при этом некоторые из них могут использовать версии определенных jar-файлов, несовместимых с теми, которые требуются другим (особенно, если вы используете Clojure 1.1 - последний стабильный выпуск - для некоторых проектов во время экспериментов. с 1.2 снимками с другими).Таким образом, правильный способ управления путем к классам - подготовить минимальную версию для каждого проекта и передать ее команде запуска JVM. Как упоминалось ранее, вам следует потратить некоторое время на то, чтобы научиться использовать хороший инструмент (например, упомянутый выше Leiningen), чтобы как можно скорее настроить путь к классам, чтобы вам не нужно было заботиться об этом самостоятельно.
(В качестве примечания, вам может потребоваться добавить больше, чем просто каталог src /
и ваши jar
s в путь к классам в некоторых сценариях, например, если вы планируете вызывать скомпилировать
для создания файлов .class
, вам также придется поместить целевой каталог в путь к классам. Однако это выходит за рамки этого вопроса.)
Кстати, я Я начал этот ответ со слова «обычно», потому что вы также можете использовать такие вещи, как load
и in-ns
, чтобы разделить одно пространство имен на несколько файлов. Однако в большинстве случаев это не то, чем вы действительно хотите заниматься; просто используйте вместо этого хорошо продуманный макет пространства имен.