clojure - 从hashmap向量构建condp

时间:2014-11-25 20:18:26

标签: clojure

我想从hashmap构建动态condp。 我有以下结构: [{:value 50:ret" value50" }  {:值100:ret" value100}]

我想动态创建以下condp:

(condp < n
50 "value50"
100 "value100"
"default")

我是否必须使用宏来创建此表达式?

2 个答案:

答案 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")