6

我有一个 clojure 应用程序,它需要一些配置变量,主要是字符串,还有要评估的东西。

我可以使用以下内容声明每个变量:

(def config-db "URI_DB"))
(def config-time (hours 1))

但我认为这可能是一个好主意(我不太确定)编写一个宏来做到这一点,它看起来像这样:

(make-config 
  config-db "URI_DB"
  config-time (hours 1))

(或者我可以将名称放在一个向量中,看起来更像是一个 let 语句)

但是当我放置不止一对时,我遇到了问题,我这样做了:

(defmacro define-config
  [name definition]
  `(def ~name ~definition))

但我真的不知道如何将其扩展为更有用的东西......

有什么建议或想法吗?

4

1 回答 1

10

我强烈建议单独做每一个def。这个宏是微不足道的,但不是很有用。当有人看到def时,他们确切地知道发生了什么。当他们看到您的自定义make-config调用时,他们必须查看实现make-config以了解发生了什么。您在大型示例中删除了一些字符并失去了可读性。

话虽如此,您可以制作一个宏来轻松执行此操作:

(defmacro make-config [& forms]
  `(do ~@(for [[name body] (partition 2 forms)]
           `(def ~name ~body))))

以及一个使用示例:

user=> (make-config foo "foo" bar (str "b" "a" "r"))
#'user/bar
user=> foo
"foo"
user=> bar
"bar"
于 2012-10-13T22:16:43.427 回答