【问题标题】:Passing Args to Clojure from Java从 Java 将 Args 传递给 Clojure
【发布时间】:2010-06-16 17:27:27
【问题描述】:

我想将 Clojure 代码嵌入 Java。 This 站点对设置它的基础很有帮助,但它传递的唯一 arg 是 String 类型。我也尝试过使用整数,而且这些也可以。

我的问题是是否有某种格式化的方式可以将结构化数据传递给 Clojure。特别是,我有一个点列表,我想传递给 Clojure 并变成一个看起来像这样的向量:

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

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

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

【问题讨论】:

    标签: java interop clojure methods arguments


    【解决方案1】:

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

    例如您可以直接传递一个 Java 点数组并执行以下操作:

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

    【讨论】:

    • 好吧,我不完全确定我最终会想要什么格式 - 现在主要是探索性的。您的解决方案肯定最适合对象。
    【解决方案2】:

    当您想要传入一个简单的数据结构时,您已经将其格式化为类似于 Java 中的 Clojure,您可以将该 arg 作为字符串传入。因此,对于我在问题中给出的示例,我会传入

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

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

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

    上面会在传入示例String的时候产生一个向量。

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多