在 EDN 中,如何将多个值传递给从其他标记元素返回的标记元素

In EDN, how can I pass multiple values to tagged element returned from other tagged elements

我关注了 EDN

{
    :test #xyz/getXyz #abc/getAbc #fgh/getFgh "sampleString"
}

在 Clojure 中,我为每个内部调用 java 函数的标记元素定义了实现。我有一个要求,我需要将 #abc/getAbc 和 #fgh/getFgh 的 return 值作为单独的参数传递给 #xyz/getXyz 。 在我当前的实现中,#fgh/getFgh 是通过 "sampleString" 调用的。并根据#fgh/getFgh 的输出调用#abc/getAbc。它的输出 #xyz/getXyz 被调用。 我的要求是 #xyz/getXyz 应该使用 #abc/getAbc 和 #fgh/getFgh 的 return 值作为单独的参数进行调用。

Clojure 实现

(defn getXyz [sampleString]
    (.getXyz xyzBuilder sampleString)
)

(defn getAbc [sampleString]
    (.getAbc abcBuilder sampleString)
)

(defn getFgh [sampleString]
    (.getFgh fghBuilder sampleString)
)

(defn custom-readers []
    {
        'xyz/getXyz getXyz
        'xyz/getAbc getAbc
        'xyz/getFgh getFgh
    }
)

我想修改getXyz为

(defn getXyz [abcReturnValue fghReturnValue]
    (.getXyz xyzBuilder abcReturnValue fghReturnValue)
)

你不能完全按照你的要求去做。该标记只能处理以下形式。也就是说,您可以更改 Xyz EDN 的语法,以便它可以支持采用 [Abc Fgh] 对的向量。

{:test #xyz/getXyz [#abc/getAbc "sampleString" #fgh/getFgh "sampleString"]}

我不确定你的意思是 getAbc 是否仍然需要将 getFgh 作为输入。如果是这样,它更像是:

{:test #xyz/getXyz [#abc/getAbc #fgh/getFgh "sampleString" #fgh/getFgh "sampleString"]}

现在,您标记为 reader 的 getXyz 将收到 Abc 和 Fgh 的向量。所以你需要改变你的代码来从向量中获取元素,像这样:

(defn getXyz [[abcReturnValue fghReturnValue]]
  (.getXyz xyzBuilder abcReturnValue fghReturnValue))

这使用了解构语法(注意参数被包裹在一对额外的括号中),但如果您愿意,您可以使用 firstsecond 或任何其他方式。