从Java传递Args到Clojure

时间:2010-06-16 17:27:27

标签: java interop clojure methods arguments

我想将Clojure代码嵌入到Java中。 This站点在设置它的基础知识方面很有帮助,但它传递的唯一arg是String类型。我也试过使用整数,这些也有效。

我的问题是,是否有一些格式化的方法将结构化数据传递给Clojure。特别是,我有一个我希望传递给Clojure的点列表,然后变成一个看起来像这样的矢量:

[[1 2] [3 4] [5 6]]

最简单的方法是做什么?有没有我可以在Java端做的预处理,或者我应该在Clojure结束时进行后处理,还是在Clojure中有什么东西可以处理这个?我怀疑它传递了一串数字和每个元组到Clojure的长度,并让它将String处理成一个向量。然而,Clojure的这个方面没有很多例子,我很好奇我是否遗漏了一些明显的东西。

编辑:请查看mikera的答案是您对传递Java对象感兴趣。如果您只是想提前将数据格式化为集合/地图/等的Clojure格式,请查看下面的答案。

2 个答案:

答案 0 :(得分:2)

这取决于您的数据开始时的格式,但您可能会发现最简单的方法是直接传递代表数据的Java对象并使用Clojure的Java互操作性功能读取它。

e.g。您可以直接传递一个Java数组点,并执行以下操作:

(let [point (aget some-array index)]
  (do-stuff-with-point point))

答案 1 :(得分:1)

对于那些想要传入一个简单的数据结构的情况,你已经将其格式化为Java中的Clojure,你可以将该arg作为字符串传递。因此,对于我在问题中给出的例子,我会传入

"[[1 2] [3 4] [5 6]]"

作为我的arg。当你使用invoke(arg)调用Clojure时,你可以让你的函数的第一步是调用你的arg上的readString:

(defn foo [d]
  (def data (read-string d)))

传递示例String时,上面将生成一个向量。