【发布时间】:2016-05-28 20:06:54
【问题描述】:
所以我正在尝试制作一个 Clojure 宏,它可以轻松地与利用 Builder 模式的 Java 类进行互操作。
这是我迄今为止尝试过的。
(defmacro test-macro
[]
(list
(symbol ".queryParam")
(-> (ClientBuilder/newClient)
(.target "https://www.test.com"))
"key1"
(object-array ["val1"])))
下面展开
(.
#object[org.glassfish.jersey.client.JerseyWebTarget 0x107a5073 "org.glassfish.jersey.client.JerseyWebTarget@107a5073"]
queryParam
"key1"
#object["[Ljava.lang.Object;" 0x16751ba2 "[Ljava.lang.Object;@16751ba2"])
想要的结果是:
(.queryParam
#object[org.glassfish.jersey.client.JerseyWebTarget 0x107a5073 "org.glassfish.jersey.client.JerseyWebTarget@107a5073"]
"key1"
#object["[Ljava.lang.Object;" 0x16751ba2 "[Ljava.lang.Object;@16751ba2"])
我猜. 正在导致某些东西被评估和移动?在这种情况下,解决方案是引用它。但是如何引用评估表达式的结果呢?
我的目标是将映射转换为构建对象的代码,其中映射键是要调用的函数,值是传递给 Java 函数的参数。
我了解如何使用 threading 和 do-to 宏,但我试图让请求构建函数数据驱动。我希望能够以键为“queryParam”和值作为参数的地图。有了这个,我可以利用 java 类函数的全部内容,只需自己编写一个函数,并且有足够的 1 对 1 映射,我不相信其他人会觉得它很神奇。
(def test-map {"target" ["https://www.test.com"]
"path" ["qa" "rest/service"]
"queryParam" [["key1" (object-array ["val1"])]
["key2" (object-array ["val21" "val22" "val23"])]] })
(-> (ClientBuilder/newClient)
(.target "https://www.test.com")
(.path "qa")
(.path "rest/service")
(.queryParam "key1" (object-array ["val1"]))
(.queryParam "key2" (object-array ["val21" "val22" "val23"])))
【问题讨论】: