【问题标题】:When to use `constantly` in clojure, how and when are its arguments evaluated?何时在 clojure 中使用`constantly`,如何以及何时评估其参数?
【发布时间】:2010-10-25 17:00:05
【问题描述】:

在另一个问题的已接受答案中,Setting Clojure "constants" at runtime 使用了 clojure 函数 constantly

constantly 的定义如下:

(defn constantly
  "Returns a function that takes any number of arguments and returns x."
  {:added "1.0"}
  [x] (fn [& args] x))

文档字符串说明了它的作用,但没有说明为什么要使用它。

在上一题给出的答案中不断地使用如下:

(declare version)

(defn -main
  [& args]
 (alter-var-root #'version (constantly (-> ...)))
 (do-stuff))

因此,由 constant 返回的函数直接对其结果进行评估。我对这有什么用感到困惑。我可能不明白 x 在是否被包裹在“不断地”中的情况下如何被评估。

什么时候应该使用constantly,为什么需要?

【问题讨论】:

    标签: clojure evaluation


    【解决方案1】:

    当 API 需要一个函数而您只需要一个常量时,constantly 函数很有用。问题中提供的示例就是这种情况。

    大多数alter-* 函数(包括alter-var-root)都采用一个函数,允许调用者根据其旧值修改某些内容。即使您只希望新值为 7(忽略旧值),您仍然需要提供一个函数(仅提供 7 将导致尝试评估它,这将失败)。所以你必须提供一个只返回 7 的函数。(constantly 7) 只生成这个函数,省去定义它所需的工作。

    编辑:关于问题的第二部分,constantly 是一个普通函数,因此在构造常量函数之前对其参数进行评估。所以(constantly @myref)总是返回myrefconstantly被调用时引用的值,即使它后来被改变了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-18
      • 2020-09-26
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2011-07-12
      • 2016-05-28
      相关资源
      最近更新 更多