定义多个var clojure宏
我有一个clojure应用程序,它需要一些配置变量,主要是字符串,但也需要计算一些东西 我可以用如下方式声明每个变量:定义多个var clojure宏,clojure,macros,configuration-files,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语句) 但当我放了不止一
(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))
但我真的没有办法把它扩展成更有用的东西
有什么建议或想法吗?我强烈建议只需分别执行每个
def
。这个宏很小,但不是很有用。当有人看到def时,他们确切地知道发生了什么。当他们看到您的自定义makeconfig
调用时,他们必须查看makeconfig
的实现才能知道发生了什么。您在大型示例中删除了几个字符,从而失去了可读性
话虽如此,您可以制作一个宏来轻松执行此操作:
(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"
哦。如果他把它称为
setq
,每个普通的lisper都会知道他的意思。我知道这是非常古老的,但是您的用例似乎有一个映射更好地支持,例如(def-config{:db“URI\u-db”:time(hours 1)}