使用Clojure中的函数列表构建映射

时间:2017-10-26 19:53:32

标签: clojure

我对Clojure来说相对较新,所以我无法理解如何进行以下工作。

从Java方法(从反射包)开始,我想提取各种属性,最后得到如下所示的地图:

{ :name "test-method
  :return-type "String"
  :public true
}

由于构建键的逻辑可能相当复杂,我想链接一系列采用当前映射和方法对象的函数,并修改映射或按原样返回。类似的东西:

(defn build-public 
[acc method] 
(if (is-public? method) (assoc acc :public true) acc))

可能会被称为:

(make-method-map method [build-public build-return-type build-name])

我尝试了几种不同的方法,但似乎无法使其发挥作用,我们将非常感谢任何建议。

4 个答案:

答案 0 :(得分:2)

简单的方法是使用reduce:

逐个应用每个函数
user> (defn make-method-map [method fns]
        (reduce (fn [acc f] (f acc method))
                {} fns))
#'user/make-method-map-2

user> (defn make-name [acc method]
        (assoc acc :name 123))
#'user/make-name

user> (defn make-other [acc method]
        (assoc acc :something "ok"))
#'user/make-other

user> (make-method-map {:a 1 :b 2} [make-name make-other])
;;=> {:name 123, :something "ok"}

答案 1 :(得分:0)

执行此操作的一种方法是cond->,它结合了cond->的概念。

(cond-> {:my-map 1}
  (= 2 2) (assoc :two-equals-two true)
  (= true false) (assoc :not-possible "hey"))
=> {:my-map 1, :two-equals-two true}

左边的子句确定是否评估右侧的表格,初始值穿过第一个位置。

答案 2 :(得分:0)

我会写(defn method-map [method] (-> {} (assoc :return-type (get-return-type method)) (assoc :name (get-name method)) (cond-> (public? method) (assoc :public? true)))) 这样的东西:

cond->

请注意您如何在as->内嵌套->>(或->->>)。但是,将它们中的任何一个放在(defn method-map [method] (-> {} (assoc :return-type (get-return-type method)) (assoc :name (get-name method)) (assoc :public? (public? method)))) 或类似内容中可能不会像您期望的那样有效。

为什么这是留给读者的练习。

其实我会写这样的东西:

(defn method-map [method]
  {:return-type (get-return-type method)
   :name (get-name method)
   :public? (public? method)})

或者使用文字地图,如果我可以逃脱它(一步不依赖于下一个,等等)

cond->

但是这并没有显示嵌套session.query(TABLE).filter(TABLE.QueryTimestamp.in_(ts_list)).count() 的技巧。

如果你发现自己有一个函数向量,那么leetwinski的回答是好的。就像编程中的一切一样,它取决于它。

编辑: 有关正在使用的函数向量的真实示例,请在re-framepedestal中查看拦截器的概念。

答案 3 :(得分:0)

我喜欢(defn make-name [method] {:name (str (:a method) "-" (:b method))}) (defn make-other [method] {:a-is-3 (= (:a method) 3)}) (defn make-method-map [method fns] (into {} ((apply juxt fns) method))) (defn make-method-map [method fns] (reduce merge ((apply juxt fns) method))) (defn make-method-map [method fns] (apply merge ((apply juxt fns) method))) (make-method-map {:a 1 :b 2} [make-name make-other]) ; {:name "1-2", :a-is-3 false} 选项,但这里有一个不同的功能签名替代方案:

acc

juxt返回函数返回值的向量,此处into不作为输入参数,而是reducecomp用于“合并”这些哈希映射到最终结果。最初我想过使用http://edition.cnn.com/data/ocs/section/politics/index.html,但这些函数的风格并不是“可组合的”。