无法从根文件级别导出 Clojure 函数
Can't export Clojure function from root file level
我有一个用 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 可以导入的命名空间?
单段名称空间(即,(ns myns)
)由于您所观察到的原因而受到强烈反对。在默认包中,它们导致 class 名称为 myns$foo
。默认包在很多方面都非常奇怪,Java 开发人员除了最小的 hello world 程序外从不使用它。特别是,您无法从默认包中导入 class,因为没有可从中导入的包名称。
有关使用默认包不好的原因的更多示例,请参阅 Is the use of Java's default package a bad practice?;并且由于 Clojure 中的单段命名空间是通过将 classes 放入默认包中实现的,这意味着您也不应该使用单段命名空间。
我有一个用 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 可以导入的命名空间?
单段名称空间(即,(ns myns)
)由于您所观察到的原因而受到强烈反对。在默认包中,它们导致 class 名称为 myns$foo
。默认包在很多方面都非常奇怪,Java 开发人员除了最小的 hello world 程序外从不使用它。特别是,您无法从默认包中导入 class,因为没有可从中导入的包名称。
有关使用默认包不好的原因的更多示例,请参阅 Is the use of Java's default package a bad practice?;并且由于 Clojure 中的单段命名空间是通过将 classes 放入默认包中实现的,这意味着您也不应该使用单段命名空间。