繁体   English   中英

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

[英]When to use `constantly` in clojure, how and when are its arguments evaluated?

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

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

因此,不断返回的函数直接评估其结果。 我很困惑这是如何有用的。 我可能不理解如何使用和不使用“常量”来评估x

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM