问题标签 [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 投票
3 回答
7985 浏览

clojure - 如何在clojure中处理java可变长度参数?

我正在将一个 java lib 包装到 clojure 中,但是我在处理可变长度参数时遇到了问题。说,

我怎么能在clojure中调用这个函数?

0 投票
1 回答
458 浏览

clojure - Clojure 中控制流的时间——ScheduledThreadPoolExecutor 的陷阱?

我正在学习 Clojure 中的并发性。

我在http://dev.clojure.org/display/design/Scheduled+Events遇到了一个索赔(Stuart Serra?),声明:

  • Clojure 函数不能在没有阻塞或 Java 互操作的情况下将时间用于控制流
  • Java 互操作 (ScheduledThreadPoolExecutor) 不知道线程本地绑定

我不理解这些说法,请澄清一下,也许是一个例子。具体来说:

  • ScheduledThreadPoolExecutor 有什么问题?由于我正在启动一个新的(绿色)线程,因此我不希望每个线程的绑定能够继续。
  • 我可以安排一个普通的 Clojure 函数,那么是什么阻止我将所需的绑定作为词法封闭的上下文发送?

非常感谢!

0 投票
2 回答
782 浏览

java - Clojure deftype:如何约束字段类型?

我正在尝试编写一个可以在 Java 中使用的 Clojure 库,而用户不知道它是用 Clojure 编写的。为此,我需要我的字段具有正确的类型:

我喜欢我可以这样做:

它为 x/y 生成一个具有适当类型的类。但是,这似乎只适用于原语,不适用于类:

生成一个:

我期望的地方:

有没有办法限制字段类型?deftype/之外还有其他选择defrecord吗?

0 投票
3 回答
596 浏览

java - 使 Java 类在 Clojure 中作为序列工作

我正在使用一个表示一系列结果的 Java 类(有点像 Clojure 向量)。

我想将这个类与典型的 Clojure 序列函数一起使用(即我想让这个类表现得好像它支持序列抽象)但是我不能改变这个类,所以我不能让它实现clojure.lang.Seqable或类似的。此外,令人讨厌的是,该类没有实现java.util.Collectionor java.lang.Iterable

我可以看到几个选项:

  • iterator-seq在对象的(现有)迭代器上使用。
  • 将对象包装在另一个实现java.util.Collection/的类中clojure.lang.Sequable
  • 通过查询对象创建一个构建 Clojure 向量或序列的函数

还有其他选择吗?最好的方法是什么?

0 投票
1 回答
198 浏览

clojure - 线程优先,线程最后和“点”形式

为什么这两个表达式给出相同的结果?

> (macroexpand-all '(->> "string" (.charAt)))

(. "string" charAt)

> (macroexpand-all '(-> "string" (.charAt)))

(. "string" charAt)

“->>”宏不应该将“字符串”作为列表中的最后一个元素插入吗?

0 投票
1 回答
633 浏览

java - 在 Java 和 Leiningen 之间夹入 Clojure

对于一个类,我需要编写一些 JVM 代码,我希望使用 Clojure。我让它与软件堆栈的底部一起工作,但我无法让它在位于顶部和底部的 GUI 层之间工作。我的主要问题是让 Java GUI 识别我的 Clojure 文件。我想为此使用 Leiningen,但 Java 编译解决方案似乎没有考虑这种互操作性。这里的答案似乎正是我所需要的。我不明白将代码放在哪里等(只是不够详细)。有没有人有任何提示?

我尝试制作一个插件,但它似乎不起作用。我知道我的案例肯定处于问题的边缘,但一个解决方案将使在课堂环境中使用 Clojure 变得更加容易。

谢谢!

更多细节:

使用已编译的 Clojure jar 时我运气不佳。我需要创建一个(呃)有状态的 Clojure 类(即方法不能是静态的)。我的课程(src/final_project/MyLinkLayer.clj)的代码看起来像

我的 project.clj 是

该类编译(“lein compile”)很好地进入“target/classes/final_project/”,但方法没有出现。我可以通过 jar 加载类(在我的项目导入包的顶部 Java 部分中使用 Maven 工作得很好)。我什至用 Eclipse 检查了 .class 文件,生成的唯一方法是来自 Object 的方法。有什么想法吗?另外,一旦我真正进入 Clojure 课程的“有状态”部分,有人有什么想法吗?提前致谢。

0 投票
2 回答
784 浏览

eclipse - 从 Java 调用 Clojure,他们说,这很容易,他们说

我是一个初出茅庐的 Clojure 程序员,在 Eclipse 中使用过直接的 Java。我正在尝试让我的 Java 程序调用从http://dev.clojure.org/display/doc/Getting+Started+with+Eclipse+and+逆时针文章创建的简单“hello”函数。hello 函数在通过逆时针插件启动的 Clojure REPL 中运行良好。当我尝试从 Java 类执行 hello 函数时出现问题。

谷歌搜索发现基本上有两种方法可以做到这一点:clojure.lang.RT 可以加载 Clojure 源并将其作为脚本执行,或者直接在 Clojure 源编译成 JAR 时执行。

clojure.lang.RT 变体工作没有问题,但我完全不知道如何让直接调用变体工作。在 Java 文件中,编译器无法解析“myproject.core”。

Clojure 源代码是 core.clj,如下所示,并且通过 REPL 像冠军一样工作:

然而,Java 源代码不会编译:

编译器错误是...

如何配置我的逆时针项目以将 core.clj 的 .class 表示放入 classes 目录,以便可以直接从 Java 引用它?

这必须在不使用 Maven 等的情况下成为可能。不?

0 投票
1 回答
2899 浏览

clojure - 如何在 clojure/leiningen 中要求 java 类

我正在测试 Clojure/Java 互操作。我创建了一个新的 Leiningen 项目并创建了这个 project.clj 文件,其中包含一些我将使用的依赖项:

我还包括了“java-source-paths”列表,并将 hello.java 文件放入 src/java 目录,如下所示:

然后我从模板创建了这个 core.clj 文件:

正如你所看到的,我什至没有在应用程序函数中使用 hello java 类,我只是需要它,但是当我在终端中运行“lein jar”时,我得到了这个堆栈跟踪:

我应该做些什么不同的事情?

0 投票
3 回答
1559 浏览

clojure - 您如何为 Leiningen 配置专有依赖项?

我们正在开发一个有一些 Clojure-Java 互操作的项目。至此,我们有一个具有各种依赖关系的类,我们将其放入 Eclipse 中的用户库中进行开发,但当然这在使用 Leiningen (2.x) 时无济于事。我们的大多数依赖项都是专有的,因此它们不在某个存储库中。

最简单/正确的方法是什么?

我见过leiningen - 如何为本地 jar 添加依赖项?,但它似乎已经过时了?

更新:所以我按照这些说明github 上的 lein 部署文档为我的 jar 创建了一个本地 maven 存储库,并像这样编辑了我的 project.clj 文件:

其中 maven_repository 位于项目目录下(因此不使用file:///)。当我运行“lein deps”时——我收到了这条消息:

“找不到支持的算法”是什么意思,我该如何解决?

Update2:在这里找到答案的最后一点。

0 投票
1 回答
901 浏览

java - 无法从 Clojure 调用实例方法。

我对Java和clojure完全陌生。但是凭借以前在 common lisp 方面的经验,我想我会尝试一下 clojure。我无法弄清楚一些非常基本的事情。

这是实际的 Java 代码。

当我运行此代码时,结果符合预期。

在 Clojure 我试过这个:

但是当这段代码运行时,会引发以下异常:

我在这里做错了什么?