我想从hashmap构建动态condp。 我有以下结构: [{:value 50:ret" value50" } {:值100:ret" value100}]
我想动态创建以下condp:
(condp < n
50 "value50"
100 "value100"
"default")
我是否必须使用宏来创建此表达式?
答案 0 :(得分:3)
来自(doc condp)
=&gt;
...
For each clause, (pred test-expr expr) is evaluated. If it returns logical true, the clause is a match.
...
这意味着在平均情况下,您将进行m / 2比较,其中m是哈希映射中的条目数,因此如果性能在您的方案中很重要,您可能会找到更好的解决方案。
无论如何你在这里有另一种解决方案,我不会说它效率更高,对于普通的编码器来说更容易阅读,就像我一样
(def n 90)
(def clauses (hash-map 50 "value50", 100 "value100"))
(get clauses (first (filter #(< n %) (sort (keys clauses)))) "default")
编辑以确保按顺序评估条款
答案 1 :(得分:2)
是。宏将为您生成正确的表单。
(defmacro mycondp
[pred expr coll]
`(condp ~pred ~expr
~@(mapcat (juxt :value :ret) coll)
"default"))
示例:
(macroexpand-1 '(mycondp < n [{:value 50 :ret "value50"}]))
;; => (clojure.core/condp < n 50 "value50" "default")