在包含特定元数据的命名空间中查找函数的惯用方法?

时间:2013-04-03 14:43:34

标签: clojure namespaces

我正在尝试找出为包含特定元数据的函数转发命名空间的最佳方法。我想出了一个解决方案,但感觉有点尴尬,我完全不确定我是以正确的方式去做。还有第二个组件:我不只是想要函数的名称,我想找到它们然后执行它们。这是我目前正在做的事情的片段:

(defn wrap-routes
  [req from-ns]
  (let [publics (ns-publics from-ns)
        routes (->>
                (keys publics)
                (map #(meta (% publics)))
                (filter #(= (:route-handler %) true))
                (map #(:name %)))
        resp (first
                (->>
                  (map #((% publics) req) routes)
                  (filter #(:status %))))]
    (or resp not-found)))

正如你所看到的,我正在做各种各样的体操,看看我的元数据是否附加到给定命名空间中的任何函数,然后我正在做额外的工作以获得实际的功能。我相信一定有更好的方法。所以我的问题是,你会怎么做?

2 个答案:

答案 0 :(得分:3)

(defn wrap-routes [req from-ns]
  (or (first (filter :status
                     (for [[name f] (ns-publics from-ns)
                           :when (:route-handler (meta f))]
                       (f req))))
      not-found))

答案 1 :(得分:1)

您可以这样做:

(defn wrap-routes
  [req from-ns]
  (->> (ns-publics from-ns)
       (filter #(:route-handler (meta (%1 1))))
       (map #((%1 1) req))
       (filter #(:status %))
       first
       (#(or % not-found))))