【问题标题】:Define multiple var clojure macro定义多个 var clojure 宏
【发布时间】:2012-10-04 04:22:01
【问题描述】:

我有一个 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 config {:db "URI_DB" :time (hours 1)})

标签: clojure macros configuration-files


【解决方案1】:

我强烈建议单独执行每个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"

【讨论】:

  • 噢。如果他称它为setq,每个普通的 lisper 都会知道他的意思。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
相关资源
最近更新 更多