【问题标题】:How do I reference functions in other files with leiningen?如何使用 leiningen 引用其他文件中的函数?
【发布时间】:2012-05-02 00:06:16
【问题描述】:

我对 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 时,都会出现上述异常。我做错了什么?

【问题讨论】:

    标签: clojure classpath leiningen


    【解决方案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 希望对您有所帮助

    【讨论】:

    • 亚瑟,非常感谢您的回答和解释。对此,我真的非常感激。我通过删除需求并在其位置添加(使用 omg.greeter)来使其工作。
    猜你喜欢
    • 1970-01-01
    • 2014-12-25
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2019-11-22
    • 2014-01-15
    • 2010-10-25
    相关资源
    最近更新 更多