【问题标题】:Java-Clojure interop in REPL: 'require versus 'import a Java classREPL 中的 Java-Clojure 互操作:“需要与”导入 Java 类
【发布时间】:2013-06-12 19:53:32
【问题描述】:

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

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

我可以 importjblas 的课程,但我想改为 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 变成required 并别名为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

【问题讨论】:

  • 对solveLeastSquares的等效且更简洁的调用:(Solve/solveLeastSquares foo bar)

标签: java clojure interop


【解决方案1】:

require 和 import 的用途不重叠:

  • Require 仅适用于 Clojure 命名空间。
  • 导入仅适用于 java 类

我认为目前没有办法给 java 包起别名,你能做的最好的就是像使用 Solve 一样导入它,以避免输入包名。你不能使用导入,给它一个不同的包名。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多