我想将Clojure代码嵌入到Java中。 This站点在设置它的基础知识方面很有帮助,但它传递的唯一arg是String类型。我也试过使用整数,这些也有效。
我的问题是,是否有一些格式化的方法将结构化数据传递给Clojure。特别是,我有一个我希望传递给Clojure的点列表,然后变成一个看起来像这样的矢量:
[[1 2] [3 4] [5 6]]
最简单的方法是做什么?有没有我可以在Java端做的预处理,或者我应该在Clojure结束时进行后处理,还是在Clojure中有什么东西可以处理这个?我怀疑它传递了一串数字和每个元组到Clojure的长度,并让它将String处理成一个向量。然而,Clojure的这个方面没有很多例子,我很好奇我是否遗漏了一些明显的东西。
编辑:请查看mikera的答案是您对传递Java对象感兴趣。如果您只是想提前将数据格式化为集合/地图/等的Clojure格式,请查看下面的答案。
答案 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时,上面将生成一个向量。