Variables 在clojure中定义多个常量变量

Variables 在clojure中定义多个常量变量,variables,clojure,constants,Variables,Clojure,Constants,我试图在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

我试图在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)

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

如果要为
x
y
z
单独定义变量,则必须单独定义每个变量:

(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])

请注意,clojure中的
^:const
与其他语言中的
const
不同,特别是变量始终是可变的,
^:const
元数据告诉编译器它可以内联一个基元值,但不会阻止您以任何方式错误地更改它。那么,有没有办法在clojure中创建一个最终的不可变值?当然,我们有不可变的数据结构。但是vars是一个可变的容器。我想补充一点,虽然vars是可变的,但是除了在动态开发中,您通常不会以编程方式更改它们的(根)值。您的C/C++是错误的。我能通过编译器的最近距离是`const int x=0,y=0,z=0;`,它分别定义了每个变量。