"从java调用clojure"的大多数顶级谷歌点击都已过时,建议使用clojure.lang.RT编译源代码.如果您已经从Clojure项目中构建了一个jar并将其包含在类路径中,您能否帮助清楚地解释如何从Java调用Clojure?
Clojure具有gen-class,reify,proxy以及deftype和defrecord来定义新的类类数据类型.对于一种重视句法简洁性并憎恶不必要的复杂性的语言来说,这似乎是一种失常.有人可以解释为什么会这样吗?Common Lisp风格的defclass能够满足吗?
是否有可能在使用leiningen的项目中与Clojure一起轻松管理和编译本机Java类?
我工作在一个相当低的水平(使用netty nio),并认为一些管道类实际上更容易处理作为原始java在构造代码和性能方面.
我将一个java lib包装到clojure中,但是我在处理可变长度参数时遇到了问题.说,
TestClass.aStaticFunction(Integer... intList){/*....*/}
Run Code Online (Sandbox Code Playgroud)
我怎么能在clojure中调用这个函数?
我有一个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
我有以下代码:
(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中使用的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) 为什么不(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库,它是从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的协议和记录可用?