【发布时间】:2019-01-25 06:49:21
【问题描述】:
我正在通过一个宠物项目学习 Clojure。该项目将由几个 workers 组成,它们将从其他函数中调用。
每个工作人员在自己的命名空间中定义为一组函数(目前有两个:get-data 用于收集数据,write-data 用于将收集的数据写入文件)。
为了使代码更干一点,我决定编写一个宏,将命名空间中的函数收集到一个可以传递的映射中:
(ns clojure-bgproc.workers)
(defmacro gen-worker-info []
(let [get-data (ns-resolve *ns* 'get-data)
write-data (ns-resolve *ns* 'write-data)]
`(def ~(quote worker-info)
{:get-data ~get-data
:write-data ~write-data}
)
)
)
在我的工作代码中,我使用了我的宏(为清楚起见,代码被删减):
(ns clojure-bgproc.workers.summary
(:require [clojure-bgproc.workers :refer [gen-worker-info]]))
(defn get-data [params]
<...>
)
(defn write-data [data file]
;; <...>
)
(gen-worker-info)
虽然它确实有效(我在 clojure-bgproc.workers.summary/worker-info 中获得了我的 get-data 和 write-data 函数,但我觉得它有点恶心,特别是因为如果我将宏调用移动到文件顶部,它不会没用。
我的问题是,有没有更惯用的方法呢?这就是惯用的 Clojure 吗?
谢谢。
【问题讨论】:
-
哦,好的,谢谢!可以在那里交叉发布吗?还是我应该先在这里删除这个问题?