Подтвердить что ты не робот

Как я могу ссылаться на функции в других файлах с leiningen?

Я все еще довольно новичок в Clojure, поэтому приношу свои извинения, если это вопрос полностью новичков, но я не смог найти достаточный ответ в Интернете.

В основном, моя проблема в том, что в любой момент, когда я пытаюсь запустить мой проект, я получаю сообщение об ошибке:

Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException: Could not locate greeter__init.class or greeter.clj on classpath: 

В этом случае greeter.clj находится в проекте в том же каталоге, что и файл, содержащий мою главную функцию.

В целях иллюстрации я создал проект с деревом каталогов следующим образом:

enter image description here

Мой код для core.clj выглядит следующим образом:

(ns omg.core
(require [greeter]))

(defn -main[] (greet))

Мой код для greeter.clj:

(ns greeter)

(defn greet [] println("Hello world"))

Всякий раз, когда я печатаю lein run -m omg.core, я получаю исключение, упомянутое выше. Что я делаю неправильно?

4b9b3361

Ответ 1

пространство имен greeter на неправильном уровне

(ns omg.greeter)

Имена в пространстве имен соответствуют папкам в пути, поэтому для использования файла в /src/omg/greeter.clj, этот файл должен содержать пространство имен omg.greeter. если вы хотите, чтобы он просто назывался greeter, переместите его вниз по одной папке

При использовании require вам нужно указать пространство имен вызываемой функции, в данном случае это будет (omg.greeter/greet). так как это боль, функция use требует пространства имен и добавляет все ее функции в текущее пространство имен. Другим вариантом, который является более избирательным, является использование require с параметром: refer в определении пространства имен

(ns omg.core
    (require [omg.greeter :refer :all]))

или

(ns omg.core
    (require [omg.greeter :refer [greet]]))

Большинство людей помещают требования пространства имен в вызов ns в верхней части файла.

быстрое чтение http://clojure.org/namespaces, надеюсь, поможет