我正在尝试在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)
但这些都不起作用。我必须单独定义每个变量吗?
答案 0 :(得分:6)
如果您想为x
,y
和z
单独设置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])