何时在clojure中使用`constant`,如何以及何时评估其参数?

Ale*_*ard 16 evaluation clojure

在另一个问题的接受答案中,在运行时设置Clojure"常量",使用clojure函数constantly.

constantly看起来像这样的定义:

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

文档字符串说明了它的作用但不是为什么会使用它.

在上一个问题中给出的答案中,常常使用如下:

(declare version)

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

因此,不断返回的函数直接评估其结果.我很困惑这是如何有用的.我可能不理解如何x在"不断"包装中进行评估.

我什么时候应该使用constantly,为什么有必要?

Raf*_*ird 13

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

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

编辑:对于问题的第二部分,constantly是一个普通函数,因此在构造常量函数之前对其参数进行求值.因此,即使稍后更改,也(constantly @myref)始终返回被调用myref时引用的值constantly.