我有以下 EDN 文件
:abc #request/builder/abc {
"def" #request/builder/def {
"someVector" ["sample1", "sample2"]
}
}
我在 Clojure 中定义了自定义标签阅读器,它在内部调用 java 代码
(defn custom-readers []
{
#request/builder/def defBuilder
#request/builder/abc abcBuilder
}
)
(defn defBuilder [params]
(.defBuilder (someJavaUtilityClass.) params)
)
(defn abcBuilder [params]
(.abcBuilder (someJavaUtilityClass.) params)
)
当我使用 edn/read-string 读取 EDN 时,defBuilder 首先执行,它的值被传递给 abcBuilder。
我想在不修改 EDN 的情况下反转执行顺序。我想修改 abcBuilder 代码,这样如果 abcBuilder 中的 java 调用返回一些值,则只执行 defBuilder。我怎样才能做到这一点。
我尝试通过修改代码如下
(defn defBuilder [params]
'(.defBuilder (someJavaUtilityClass.) params)
)
(defn abcBuilder [params]
if((.abcBuilder (someJavaUtilityClass.) params)
(eval (get params "def"))
)
)
但这会引发类似“无法解析 someJavaUtilityClass 和参数”的错误。有没有更好的方法来解决这个问题?