问题标签 [clojure-java-interop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
877 浏览

clojure - 将 Java 方法作为参数传递

假设我们有一个 Java 类:

下面的代码在 Clojure 中不起作用:

产生预期的错误(这里没有问题):

CompilerException java.lang.RuntimeException:无法解析符号:在此上下文中的 foo,正在编译...:

但是如果我尝试引用符号

它会产生一个不同但也是预期的错误:

IllegalArgumentException 找不到匹配的字段:com.dullesopen.srl.FunCall clojure.lang.Reflector.getInstanceField 类的方法(Reflector.java:271)

该错误是预期的,因为根据特殊形式的文档。(点)第二个参数被假定为匹配字段或方法的名称,因此从 Clojure 的角度来看,它不是一个实际的符号。

下面的方法解决了这个问题,但我不喜欢额外的memfn. 对我来说,这表明 Java 方法实际上并不是 Clojure 中的第一类对象。

所以问题是:有没有办法“指示”.第二个参数应该以某种方式解析/评估以获得方法名称的特殊形式?或者也许还有另一个类似于 dot 但解决了第二个参数的特殊情况?

0 投票
1 回答
80 浏览

clojure - 在 clojure 中获取相同的 RandomAccessFile 实例

这段代码在服务器上运行,它检测文件的更改并将其发送给客户端。这是第一次工作,之后文件长度没有得到更新,即使我更改了文件并保存了它。我想clojure 的不变性是这里的原因。我怎样才能使这项工作?

0 投票
2 回答
497 浏览

clojure - Clojure:多种类型提示?

如何为一个变量指定两种类型的可能性?

谢谢!

0 投票
2 回答
762 浏览

clojure - clojure gen-class returning own class

I'm now making a class object with Clojure which has a method returning the object itself.

Written with Java, the object that I'd like to make is like,

The current clojure code that I wrote is like,

However, I got an error as follows.

While I have googled about this issue, I couldn't find any answers. Does anyone know the solution for this issue?

Thank you in advance for your help.

0 投票
1 回答
129 浏览

clojure - Clojure Java 互操作 - NoSuchMethodErrors

我一直在尝试使用 Clojure 及其 Java 互操作功能进行一些简单的测试,但遇到了一些问题。我正在与 Parallel Colt Java 库交互,尝试LU 分解- Parallel Colt 提供的功能。我看到表格的错误

NoSuchMethodError edu.emory.mathcs.utils.ConcurrencyUtils.getThreadsBeginN_1D ” ...

这是我正在使用的一些简单代码:

我可以在“b”、DenseDoubleMatrix1D 上调用一些函数,例如 size() 和 elements()。另外,我可以打电话

使用 clojure 互操作语法作为

它会将“b”的第一个元素更新为 10.5。

但是,当我在“b”上调用其他一些方法时,例如

作为

将 b 的所有元素设置为 10.0,我得到一个 NoSuchMethodError。本质上,我似乎对某些互操作方法有正确的调用,但对其他方法则没有,而且我不确定自己做错了什么。

我尝试时看到同样的错误

作为参考,这里是并行 colt javadoc ( http://incanter.org/docs/parallelcolt/api/ ) 注意,我使用的是稍微更新的并行 colt 版本。

0 投票
1 回答
72 浏览

clojure - 在 Clojure 中导入 Java 代码 - 协议缓冲区

我有一个带有 Proto$Event.class 类的 JAR(从 Protocol Buffer 编译)。现在我想在 Clojure 项目中使用它。

我按照以下步骤将 JAR 包含在我的 clojure 项目中。

但我无法在 clojure 中运行此代码:

错误:

有什么建议吗?

谢谢

0 投票
1 回答
263 浏览

java - 为什么这个 Clojure 代码与 Java 中的替代代码相比如此缓慢?

tl;博士:为什么下面的代码这么慢?

我尝试优化以下代码以提高速度;它的目的是在进行 n^2 操作时将一个数组(大小 n=1000)转换为另一个(大小相同),转换的细节现在并不重要。

由于我试图获得尽可能快的速度,所以我尽可能地使用 Java 原语;尽管如此,我得到的通常是每个“转换”调用大约 70 毫秒。重写为 Java 时,平均调用时间小于 2 毫秒。

1) 哇,Java 真快

2) 哇,Clojure 很慢

3)你能向我解释一下,为什么会这样?天真地,我希望 Clojure 生成一个代码字节码,应该非常接近 Java 的,为什么不是这样?

4) 我不是 100% 确定如何使用这些 ^ints 提示,也许我弄错了?

0 投票
1 回答
178 浏览

java - 访问未在 Clojure 中导入的 Java 类的字段、方法

我开始更多地了解 Clojure-Java 互操作。如果我在 Clojure 中创建一个 Java 类,我需要导入它,但如果我只是使用类的字段或方法,我不必导入它。例如:

这不会在没有 import 的情况下编译Double2D,因为代码会创建一个Double2D实例。

但是,我访问实例的yard字段和setObjectLocation()方法以及Students实例的字段widthheight字段这一事实Continuous2D不会导致任何问题,即使我不导入StudentsContinuous2D类。

这是否意味着 Clojure 在运行时使用反射来访问 Java 字段和方法?那效率低吗?如果我需要函数的速度,是否可以为 Java 类添加类型声明以及缺少的导入语句?这会阻止反射吗?

[编辑:正如我对 Arthur Ulfeldt 回答的第二条评论所暗示的那样,我现在认为,由于在编译时不知道类而导致的任何低效率可能与函数包含在变量中这一事实所导致的低效率没有太大区别。如果我担心这一点,我会忘记 Clojure 和纯 Java 编程(也许),而不是尝试使用 Clojure 中的 Java 库。对我来说,一个我可以使用 Clojure 而不是 Java 的世界是一个更好的世界。]

0 投票
1 回答
287 浏览

java - 如何使用 Clojure 的 gen-class 创建多个 Java 成员变量

对关于 Clojure-Java 互操作的一个非常古老的问题的回答解释了如何使用gen-classand:state关键字:init来创建可从 Java 访问的单个公共实例变量。如果您只需要一条数据可供 Java 类使用,或者如果您可以要求 Java 类使用读取例如存储在状态变量中的映射的访问器函数,这就足够了。此方法还允许数据更改,例如通过将atoms 存储在状态变量中。

如果我想创建多个在 Java 类中可直接读取的实例变量怎么办?这可能吗?比如我可以编译以下文件并执行Bar类,看到foo.bar打印出来的值是42。

Foo.clj:

酒吧.java:

如果我取消注释这些baz行,Bar.java 将无法编译——编译器似乎随机创建barbaz作为状态变量创建Foo,因此只有其中一个可用于Bar. 无论如何,我看不到如何初始化barbaz使用init函数。

0 投票
1 回答
168 浏览

java - 如何使用循环类型提示自动编译 gen-class 类?

在 Clojure 中,我使用gen-class的是 Java 库。程序员通常提供两个类,分别实现一个接口和扩展一个类。这两个类应该相互引用,考虑到库的设计方式,很难避免这种循环依赖。

循环不会是一个问题——编译器不必知道它们——除了我试图通过明智地添加类型提示来优化代码(具有巨大的加速)。通过重新组织代码,我已经能够避免编译器对循环依赖的抱怨,并且我已经将问题简化为单一类型提示:

在一个源文件 Foo.clj 中,我有这个函数/方法,这是该类实现的接口所必需的:

另一个源文件 Bar.clj 创建了 Foo 实例的集合,因此我必须在其中引用 Foo 类。在我的 Leiningen project.clj 中,我有这样一行:

我没有收到循环依赖错误。相反,我得到一个ClassNotFoundException: 如果我把Foofirst 放在后面:aot,编译器会抱怨它不知道什么Bar时候编译Foo^Bar因为-step. 如果我Bar先放在后面,编译器在编译时:aot找不到,因为在 Bar.clj 中的调用。FooBar(Foo.)

我目前的解决方案是这样的:

  1. 删除Foo.clj^Bar中定义的类型提示。-step
  2. 编译这两个类。
  3. -step在 Foo.clj 中重新添加类型提示。
  4. 编译Foo(即再次运行“lein compile”)。

这是有效Foo的,因为第二次编译时Bar存在,所以编译器不会抱怨。

有没有办法在不删除和添加类型提示的情况下编译这两个类?(或者我应该以不同的方式思考这种情况?)