如何在矢量上执行具有副作用的功能?

时间:2014-01-11 23:21:41

标签: clojurescript

说 - 你好第一人的工作正常,为什么不说 - 你好 - 每个人?

(defpartial greeting [name]
  [:p.alert "Hello " name ", how are you?"])

(defn say-hello [name]
  (append $content (greeting name)))

(defn say-hello-to-first-person [names]
  (say-hello (first names)))

(defn say-hello-to-everyone [names]
  (map say-hello names))

(say-hello-to-first-person ["Chris" "Tom" "Jim" "Rocky"])
(say-hello-to-everyone ["Chris" "Tom" "Jim" "Rocky"])

2 个答案:

答案 0 :(得分:3)

你想要doseq,Clojure的“foreach”:

(doseq [name names]
  (say-hello name))

map不起作用,因为它会产生一个惰性序列:直到您实际访问序列中的项目(这里没有),它们都不会被评估,副作用也不会发生。

另一种选择是通过在map周围包裹dorun来强制进行评估。考虑其原因可能有助于您的理解(尽管此处doseq是惯用法)。

答案 1 :(得分:2)

正如@edbond在他的评论中所说,地图fn直到必要时才评估,因为map fn返回一个懒惰的seq。

这是map fn的文件     返回一个惰性序列,包含将f应用于的结果     每个coll的第一项的集合,然后将f应用于集合     每个coll中的第二个项目,直到任何一个colls     累。其他colls中的任何剩余项都将被忽略。功能     f应该接受colls of colls参数。

如果您需要确保在代码的某个特定部分评估这些值,可以使用doalldorun