为什么这样的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
传入。请注意,您实际上必须将其作为函数而不是经过评估的表达式传递。