定义多个var clojure宏

时间:2012-10-13 15:28:30

标签: clojure macros configuration-files

我有一个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))

但我真的没有任何关于如何在更有用的东西中扩展它的粘合剂......

有任何建议或想法吗?

1 个答案:

答案 0 :(得分:9)

我强烈建议您分别执行每个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"