Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
定义多个var clojure宏_Clojure_Macros_Configuration Files - Fatal编程技术网

定义多个var 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语句) 但当我放了不止一

我有一个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))
但我真的没有办法把它扩展成更有用的东西


有什么建议或想法吗?

我强烈建议只需分别执行每个
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)}