ビルダーパターンを使用してJavaクラスとの相互運用を容易にするClojureマクロを作成しようとしています。文字列を使用してJava関数を呼び出すClojureマクロを作成する
これまで私が試したことは次のとおりです。以下
(.
#object[org.glassfish.jersey.client.JerseyWebTarget 0x107a5073 "[email protected]"]
queryParam
"key1"
#object["[Ljava.lang.Object;" 0x16751ba2 "[Ljava.lang.Object;@16751ba2"])
に展開
(defmacro test-macro
[]
(list
(symbol ".queryParam")
(-> (ClientBuilder/newClient)
(.target "https://www.test.com"))
"key1"
(object-array ["val1"])))
望ましい結果は次のとおりです。
(.queryParam
#object[org.glassfish.jersey.client.JerseyWebTarget 0x107a5073 "[email protected]"]
"key1"
#object["[Ljava.lang.Object;" 0x16751ba2 "[Ljava.lang.Object;@16751ba2"])
私は.
が評価され、周りに移動し得るために何かを引き起こしていると思いますか?その場合、解決策はそれを引用することになります。しかし、評価された式の結果をどのように引用できますか?
私の目標は、mapキーを呼び出す関数にして値をJava関数に渡す引数にすることによって、マップをオブジェクトを構築するコードに変換することです。
私はスレッドとdo-toマクロの使い方を理解していますが、機能構築のためにリクエストデータを作成しようとしています。私は "queryParam"としてキーと引数として値を持つマップを取ることができるようにしたい。これを持っていることで、Javaクラス全体で1つの関数を書くだけで十分で、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"])))