为什么这样的Clojure代码:

user=> (map (constantly (println "Loop it.")) (range 0 3))

产生以下输出:
Loop it.
(nil nil nil)

我希望它可以打印三遍“Loop it”,这是对该函数进行三遍评估的副作用。

最佳答案

constantly不会多次评估其参数。它是一个函数,而不是宏,因此该参数在constantly运行之前仅被评估一次。 constantly所做的全部就是获取其(已评估的)参数并返回一个函数,该函数在每次调用时都返回给定值(无需重新评估任何内容,因为我说过,该参数在constantly甚至运行之前就已经进行了评估)。

如果您要做的只是为范围内的每个元素调用(println "Loop it"),则应将其作为映射函数而不是constantly传入。请注意,您实际上必须将其作为函数而不是经过评估的表达式传递。

09-28 06:13