定义多个var clojure宏

Sis*_*cia 5 macros clojure configuration-files

我有一个clojure应用程序需要一些配置变量,主要是字符串,但也需要评估.

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

(def config-db "URI_DB"))
(def config-time (hours 1))
Run Code Online (Sandbox Code Playgroud)

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

(make-config 
  config-db "URI_DB"
  config-time (hours 1))
Run Code Online (Sandbox Code Playgroud)

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

但是当我放了一对以上的夫妇时,我遇到了问题,我这样做了:

(defmacro define-config
  [name definition]
  `(def ~name ~definition))
Run Code Online (Sandbox Code Playgroud)

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

有什么建议或想法吗?

Ray*_*yne 9

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

话虽如此,你可以制作一个宏来轻松地做到这一点:

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

以及用法示例:

user=> (make-config foo "foo" bar (str "b" "a" "r"))
#'user/bar
user=> foo
"foo"
user=> bar
"bar"
Run Code Online (Sandbox Code Playgroud)