【问题标题】:Defining multiple constant variables in clojure在 clojure 中定义多个常量变量
【发布时间】:2016-06-03 01:43:03
【问题描述】:

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

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

【问题讨论】:

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

标签: variables clojure constants


【解决方案1】:

如果您想为 x、y 和 z 分别定义一个 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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多