Variables 在clojure中定义多个常量变量
我试图在clojure中定义几个常量变量。有没有一种方法可以在一个def语句中定义它们?或者我必须分别定义每一个 在任何编程语言(C++Java)中,您都可能希望能够执行以下操作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
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;`,它分别定义了每个变量。