在clojure中定义多个常量变量

时间:2016-02-21 18:15:14

标签: variables clojure const

我正在尝试在clojure中定义几个常量变量。有没有办法在一个def语句中定义所有这些?或者我必须单独定义每一个吗?

在任何编程语言(C ++ Java)中,您可能希望能够执行以下操作

    const int x, y, z;
    x = y = z = 0;

然而,在clojure中,我在使用def声明做类似的事情时遇到了麻烦。我尝试过基于'let'语法的东西:

    (def ^:const [x 2 y 3 z 8])

等等

    (def ^:const x 2 y 3 z 8)

但这些都不起作用。我必须单独定义每个变量吗?

1 个答案:

答案 0 :(得分:6)

如果您想为xyz单独设置Var,则必须单独定义每个Var:

(def x 2)
(def y 3)
(def z 8)

如果这太麻烦,你可以轻松编写一个宏来定义多个常量:

(defmacro defs
  [& bindings]
  {:pre [(even? (count bindings))]}
  `(do
     ~@(for [[sym init] (partition 2 bindings)]
         `(def ~sym ~init))))

(defs x 2 y 3 z 8)

如果这三个常数相关,您可以改为定义一个带有每个数字的条目的地图:

(def m {:x 2, :y 3, :z 8})

根据您的使用情况,您甚至可能会发现将它们定义为矢量非常有用:

(def v [2 3 8])