Clojure不断和地图功能

Mik*_*ike 6 functional-programming clojure

为什么这个Clojure代码:

user=> (map (constantly (println "Loop it.")) (range 0 3))
Run Code Online (Sandbox Code Playgroud)

产生此输出:

Loop it.
(nil nil nil)
Run Code Online (Sandbox Code Playgroud)

我希望它能三次打印"循环它"三次作为评估功能的副作用.

sep*_*p2k 9

constantly不会多次评估其参数.它是一个函数,而不是一个宏,所以参数在constantly运行之前只被评估一次.所有constantly这一切都需要它的(计算)参数并返回一个函数,每次调用它时都会返回给定值(不重新评估任何东西,因为正如我所说,参数在constantly偶数运行之前已经被评估).

如果您只想调用(println "Loop it")范围中的每个元素,则应将其作为映射函数传递而不是constantly.请注意,您实际上必须将其作为函数传递,而不是计算表达式.

  • 请注意,如果您只想要副作用,则应使用`doseq`或`dotimes`.由于`map`是懒惰的,除非用`doall`或`dorun`强制它,否则你不会得到你想要的结果. (10认同)