标签: clojure-java-interop

从java调用clojure

"从java调用clojure"的大多数顶级谷歌点击都已过时,建议使用clojure.lang.RT编译源代码.如果您已经从Clojure项目中构建了一个jar并将其包含在类路径中,您能否帮助清楚地解释如何从Java调用Clojure?

java clojure clojure-java-interop

161
推荐指数
5
解决办法
4万
查看次数

为什么Clojure有5种方法来定义一个类而不是一个?

Clojure具有gen-class,reify,proxy以及deftype和defrecord来定义新的类类数据类型.对于一种重视句法简洁性并憎恶不必要的复杂性的语言来说,这似乎是一种失常.有人可以解释为什么会这样吗?Common Lisp风格的defclass能够满足吗?

clojure clojure-java-interop

81
推荐指数
2
解决办法
1万
查看次数

Java和Clojure与Leiningen合作

是否有可能在使用leiningen的项目中与Clojure一起轻松管理和编译本机Java类?

我工作在一个相当低的水平(使用netty nio),并认为一些管道类实际上更容易处理作为原始java在构造代码和性能方面.

java integration clojure leiningen clojure-java-interop

42
推荐指数
3
解决办法
1万
查看次数

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

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

TestClass.aStaticFunction(Integer... intList){/*....*/}
Run Code Online (Sandbox Code Playgroud)

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

clojure variadic-functions clojure-java-interop

38
推荐指数
3
解决办法
6402
查看次数

Clojure:以惯用的Clojure方式使用java.util.HashMap

我有一个java.util.HashMap对象m(调用Java代码的返回值),我想获得一个带有附加键值对的新映射.

如果m是Clojure地图,我可以使用:

(assoc m "key" "value")
Run Code Online (Sandbox Code Playgroud)

但试着这样做HashMap:

java.lang.ClassCastException:java.util.HashMap无法强制转换为clojure.lang.Associative

没有运气seq:

(assoc (seq m) "key" "value")
Run Code Online (Sandbox Code Playgroud)

java.lang.ClassCastException:clojure.lang.IteratorSeq无法强制转换为clojure.lang.Associative

我设法做到的唯一方法是使用HashMap自己的put,但返回void所以我必须明确返回m:

(do (. m put "key" "value") m)
Run Code Online (Sandbox Code Playgroud)

这不是惯用的Clojure代码,m而是我正在修改而不是创建新的地图.

如何HashMap使用更多Clojure-ish方式?

interop clojure hashmap purely-functional clojure-java-interop

27
推荐指数
3
解决办法
1万
查看次数

使用"lein run"运行时,shutdown hook不会触发

我有以下代码:

(ns test-hook.core)

(defn -main []
  (.addShutdownHook (Runtime/getRuntime) (Thread. #(println "shutdown")))
  (println "start")
  (doseq [i (range 1 6)]
    (Thread/sleep 1000)
    (println i)))
Run Code Online (Sandbox Code Playgroud)

以及project.clj

(defproject test-hook "1.0.0-SNAPSHOT"
  :aot :all
  :main test-hook.core
  :description "FIXME: write description"
  :dependencies [[org.clojure/clojure "1.2.0"]])
Run Code Online (Sandbox Code Playgroud)

当我使用"lein run"运行它时,关闭钩子仅在正常程序执行时执行,而不是在接收SIGINT时执行(Ctrl-C)

在lein外部运行时相同的代码即使在接收到SIGINT时也会成功执行shutdown hook.

如何从lein运行并使用Ctrl-C中止时执行关闭挂钩?

clojure leiningen shutdown-hook clojure-java-interop

17
推荐指数
1
解决办法
3056
查看次数

使用Java对象作为Clojure映射

我有一个我想在Clojure中使用的Java类.但是,我想将它用作Clojure地图.这样做的步骤是什么?

我查看了代码IPersistentMap- 如果Java类实现了吗?或者是否应该有一些实现协议的Clojure代码?

我知道我可以编写一些映射代码,将代码从Java对象显式转换为映射,但该解决方案具有很高的努力/回报率.此外,我可能会多次遇到同样的情况.


具体示例:我有一个用Java编写的解析器.我想使用它来解析一些文本,然后访问解析数据结构的内容,就像它在Clojure映射中一样:

(def parser (new MyParser))

(let [parse-tree (parser ... parse some text ...)]
  ((parse-tree :items) "itemid"))
Run Code Online (Sandbox Code Playgroud)

java clojure clojure-java-interop

16
推荐指数
2
解决办法
3428
查看次数

在Clojure中创建Java类的选项

有几种不同的方法来创建Clojure中的Java类,所以什么都捡之间时,权衡gen-class,proxyreifyClojure中?(还有其他方法来创建我没有列出的Java类吗?)

我的基本理解是我已经按照权力的递减顺序列出了这些结构.

clojure clojure-java-interop

13
推荐指数
2
解决办法
2532
查看次数

为什么(int 10)生成一个Long实例?

为什么不(int 10)生成类型的实例java.lang.Integer

; why Long here?
=> (type (int 10))
; java.lang.Long

; this one is also Long, why not java.lang.Number?
=> (type (num 10))
; java.lang.Long

=> (type (double 10))
; java.lang.Double
=> (type (long 10))
; java.lang.Long
=> (type (float 10))
; java.lang.Float
=> (type (short 10))
; java.lang.Short
=> (type (bigint 10))
; clojure.lang.BigInt
=> (type (bigdec 10))
; java.math.BigDecimal
=> (type (boolean 10))
; java.lang.Boolean
=> (type (char 10))
; java.lang.Character
=> …
Run Code Online (Sandbox Code Playgroud)

clojure type-coercion clojure-java-interop

13
推荐指数
2
解决办法
2024
查看次数

创建一个Protocols和defrecords库,供Java使用

目前,我有一个完全功能的Clojure库,它是从Java调用的.

我这样做的方式:我有一个文件,它使用gen-class将整个API包装为单个类的静态方法,并以IPersistentVector和IPersistentMap的形式传入和传出数据.

然而,现在,我正在重构库并将功能置于各种协议之后.

我有四个协议,我们称之为A,B,C和D.两个defrecords,X和Y.X和Y都实现协议A,B和C.而Y也实现D.

我需要做些什么才能使这些可用于Java?这些是否自动作为接口和类?或者我仍然必须做相当于gen-class的公开?

如果没有,什么是gen-class:methods子句的等价物,我在哪里定义方法参数的Java类型?

有没有人有一个简单的例子可以让Java的协议和记录可用?

clojure clojure-java-interop clojure-protocol

12
推荐指数
1
解决办法
424
查看次数