REPL 中的 Java-Clojure 互操作:"require"与"导入 Java 类"



这个问题涉及到clatrix Clojure库[1]和jblas Java库[2](前者部分封装了后者)。

我通过clatrix目录中的lein repl启动Clojure REPL,其中project.clj指定了对org.jblas的依赖。(这是clatrix与我的问题相关的程度。)

我能够import jblas的类,但我想require他们代替。

user> (import '[org.jblas DoubleMatrix Solve])
org.jblas.Solve
user> (. Solve solveLeastSquares (. DoubleMatrix rand 2 2) (. DoubleMatrix rand 2 1))
#<DoubleMatrix [1.965810; -1.044592]>
user> (require '[org.jblas Solve])
FileNotFoundException Could not locate org/jblas/Solve__init.class or org/jblas/Solve.clj on classpath:   clojure.lang.RT.load (RT.java:432)

我可以只require Clojure库,而不是Java的?我有标点错误吗?

基本原理:如果我可以将org.jblas.Solve改为require d并别名为S(仅作为示例),我可以简单地使用(S/solveLeastSquares foo bar),我发现这比点空间表示法更好。此外,斜杠符号在clatrix的源代码中到处使用,在REPL中进行实验时也使用斜杠符号来简化复制粘贴。

[1]参见https://github.com/tel/clatrix[2]特别是它的Solve类:https://github.com/mikiobraun/jblas/blob/master/src/main/java/org/jblas/Solve.java#L44

Require和import的用法不重叠:

  • Require只适用于Clojure命名空间
  • import只适用于java类

我不认为有一种方法来别名一个java包的时刻,你能做的最好的是导入它,因为你正在做的解决,以避免输入包的名称。你不能使用import,给它一个不同的包名。

最新更新