2010-06-16 76 views
6

我想将Clojure代码嵌入到Java中。 This网站有助于设置这个基础知识,但它唯一通过的参数是String类型。我也尝试过使用整数,而且这些也是有效的。将参数传递给Java的Clojure

我的问题是,是否有一些格式化的方式将结构化数据传递给Clojure。特别是,我点的名单,我想传递给Clojure的,变成一个载体,将是这个样子:

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

什么是去这样做最简单的方法?有没有预处理我可以在Java的末尾做,或者我应该在Clojure的后端做后处理,还是在Clojure中有一些可以处理这个问题的东西?我怀疑它传递了一串数字和每个元组的长度,并让它将字符串处理成一个向量。然而,Clojure的这方面并没有很多例子,我很好奇,如果我错过了一些明显的东西。

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

回答

2

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

例如你可以直接通过点的Java数组,做类似:

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

嗯,我不完全确定我最终会想要什么格式 - 现在大多只是探索性的。你的解决方案肯定会最适合于对象。 – 2010-06-16 18:51:09

1

对于那些情况下,当你想在你已经格式化的样子Clojure的Java中的一个简单的数据结构来传递,你可以通过在那arg作为一个字符串。所以对于我在我的问题中给出的例子,我会通过

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

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

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

以上会产生矢量时的例子字符串传递