Ответ 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
, чтобы разделить одно пространство имен на несколько файлов. В большинстве случаев это не то, что вы действительно хотите сделать; просто используйте хорошо продуманный формат пространства имен.