我正在尝试找出为包含特定元数据的函数转发命名空间的最佳方法。我想出了一个解决方案,但感觉有点尴尬,我完全不确定我是以正确的方式去做。还有第二个组件:我不只是想要函数的名称,我想找到它们然后执行它们。这是我目前正在做的事情的片段:
(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)))
正如你所看到的,我正在做各种各样的体操,看看我的元数据是否附加到给定命名空间中的任何函数,然后我正在做额外的工作以获得实际的功能。我相信一定有更好的方法。所以我的问题是,你会怎么做?
答案 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))))