2

我试图找出最好的方法来控制包含特定元数据位的函数的命名空间。我想出了一个解决方案,但感觉有点尴尬,我完全不确定我是否以正确的方式去做。这还有第二个组成部分:我不只是想要函数的名称,我想找到它们然后执行它们。这是我目前正在做的一个片段:

(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)))

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

4

2 回答 2

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))
于 2013-04-03T16:28:52.093 回答
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))))
于 2013-04-03T14:59:13.567 回答