15

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

基本上,我的问题是,每当我尝试运行我的项目时,都会收到如下错误:

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

在这种情况下,greeter.clj 与包含我的 main 函数的文件在同一目录中的项目中。

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

在此处输入图像描述

我的 core.clj 代码如下:

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

(defn -main[] (greet))

我的 greeter.clj 代码是:

(ns greeter)

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

每当我输入时lein run -m omg.core,我都会得到上面提到的异常。我究竟做错了什么?

4

1 回答 1

18

迎宾名称空间它在错误的级别

(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希望能有所帮助

于 2012-05-02T00:15:08.110 回答