从Java向Clojure传递参数

6
我希望将Clojure代码嵌入到Java中。这个网站在设置方面提供了基本的帮助,但它传递的唯一参数是字符串类型。我尝试过使用整数,也可以正常工作。
我的问题是是否有某种格式化的方法来传递结构化数据给Clojure。特别是,我有一个点列表想要传递给Clojure,并将其转换为类似于这样的向量:
[[1 2] [3 4] [5 6]]

什么是最简单的方法来执行此操作?我应该在Java端进行预处理,还是在Clojure端进行后处理,或者在Clojure中有处理这个问题的东西?我怀疑它是将数字字符串和每个元组的长度传递给Clojure,并让它将字符串处理成向量。然而,Clojure的这个方面没有太多的例子,我很好奇是否漏掉了一些明显的东西。
编辑:如果您想传递Java对象,请查看mikera的答案。如果您只想提前将数据格式化为Clojure格式以供设置/映射等使用,请查看我的下面的答案。
2个回答

2

这取决于您的数据最初的格式,但您可能会发现最容易的方法是直接传递代表数据的Java对象,并使用Clojure的Java互操作特性进行读取。

例如,您可以直接传递Java点数组,然后执行类似以下操作:

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

嗯,我不确定最终想要的格式是什么 - 目前主要只是探索性的。你的解决方案肯定会与对象一起发挥最佳作用。 - cryptic_star

1

对于那些想要传递一个已经格式化为Clojure样式的简单数据结构到Java中的情况,您可以将该参数作为字符串传递。因此,对于我在问题中提出的示例,我将传入

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

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

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

以上代码在传入示例字符串时会产生一个向量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接