java - 无法从根文件级别导出 Clojure 函数

标签 java clojure leiningen

我有一个使用 lein new 创建的 Clojure 项目。我的 Clojure 文件都在 src 文件夹中,当我运行 lein uberjar 时,所有文件似乎都已编译(当缺少内容时,我会看到其中的错误)。

src中,我有一个文件夹myns,其中包含junk.clj。该文件有

(ns myns.junk)

(defn sq [x] (* x x))

在我的java项目中加载由lein uberjar创建的jar后,我可以通过导入并调用该函数

import myns.junk$sq;

public class JavaApplication1 {
    public static void main(String[] args) {
        System.out.println(junk$sq.invokeStatic(5));       
    }  
}

但我一生都无法弄清楚如何从文件夹中不在的文件中导入函数。我的 src 文件夹中的顶级文件似乎不可见,并且无法在 Java 端导入。

如何告诉 Clojure 将顶级文件中的类似函数放入 Java 可以导入的某个命名空间中?

最佳答案

由于您所观察到的原因,强烈建议不要使用单段 namespace (即 (ns myns))。它们导致默认包中名为 myns$foo 的类。默认包在很多方面都非常奇怪,除了最小的 hello world 程序之外,Java 开发人员从不使用它。特别是,您无法从默认包中导入类,因为没有可以从中导入它的包名称。

参见Is the use of Java's default package a bad practice?有关使用默认包不好的更多原因示例;而且由于 Clojure 中的单段命名空间是通过将类放入默认包中来实现的,这意味着您也不应该使用单段命名空间。

关于java - 无法从根文件级别导出 Clojure 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44160167/

相关文章:

clojure - 在 seq 中查找最频繁项的惯用 Clojure 方法

Clojure join 无法根据过滤函数的结果创建字符串

emacs + clojure 模式 : add multiple hooks

clojure - 如何使用 leiningen 的 maven 插件

java - 从类对象指定java中的泛型类型

java - 获取 Jersey 服务器的 ResourceConfig 实例

除非使用 Leiningen REPL,否则 Clojure jdbc create-table 语句不会运行

build - 如何设置 Leiningen/ClojureScript 编译器来支持用户脚本?

java - 如何在 Hadoop 文件系统中获取绝对路径?

java - 无法在 AMD 64 位平台上加载 IA 32 位 .dll