我有一个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))
但我真的没有任何关于如何在更有用的东西中扩展它的粘合剂......
有任何建议或想法吗?
答案 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"