我对Clojure还是很陌生,因此,如果这是一个完全新手的问题,我深表歉意,但我无法在网上找到足够的答案。

基本上,我的问题是,每当我尝试运行项目时,都会出现类似以下错误:

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


在这种情况下,greeter.clj与包含我主要功能的文件位于同一目录中。

出于说明目的,我创建了一个具有如下目录树的项目:



我的core.clj代码如下:

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

(defn -main[] (greet))


我的greeter.clj代码是:

(ns greeter)

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


每当我键入lein run -m omg.core时,都会出现上述异常。我究竟做错了什么?

最佳答案

问候者在错误的级别命名空间

(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有望对您有所帮助

10-08 00:20