clojure - 从 hashmap 向量构建 condp

标签 clojure

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

我想动态创建以下 condp:

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

我必须使用宏来创建这个表达式吗?

最佳答案

来自 (doc condp) =>

... 对于每个子句,评估 (pred test-expr expr)。如果它返回逻辑真,则该子句匹配。 ...

这意味着在平均情况下,您将进行 m/2 次比较,其中 m 是 HashMap 中的条目数,因此如果性能在您的场景中很重要,您可能会找到更好的解决方案。

无论如何,这里有一个替代解决方案,我并不是说它更有效,只是对于像我这样的普通编码人员来说更容易阅读

(def n 90)
(def clauses (hash-map 50 "value50", 100 "value100"))
(get clauses (first (filter #(< n %) (sort (keys clauses)))) "default")

编辑以确保按顺序评估子句

关于clojure - 从 hashmap 向量构建 condp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27135915/

相关文章:

clojure - 使用 clojure 将 EDN 文件读入 java 对象时如何避免打印对象哈希码

clojure - 如何在 Clojure 中向当前日期添加天数

java - Clojure :gen-class not working in Java app

xml - clojure - 将没有属性的 xml 解析为映射的简单方法

Clojure 重新查找 reg-ex OR

clojure - Compojure:lein-ring 正在生产中?

clojure - 如何从具有副作用的函数中获取返回值的集合?

xml - Hadoop 会为我带来更多好处吗?

clojure - 如何在 leiningen 中使用 checkin 的 jar

lisp - 帮我写一个 Clojure 宏,它会自动将元数据添加到函数定义中