说 - 你好第一人的工作正常,为什么不说 - 你好 - 每个人?
(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参数。
如果您需要确保在代码的某个特定部分评估这些值,可以使用doall或dorun