向第一人称打招呼效果很好,为什么不向所有人打招呼呢?

(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"])
有帮助吗?

解决方案

你要 doseq, ,Clojure 的“foreach”:

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

map 不起作用,因为它产生一个惰性序列:在您实际访问序列中的项目(此处不访问)之前,不会评估任何项目,也不会发生副作用。

另一种选择是通过包装来强制评估 dorun 周围的 map. 。思考为什么它有效可能会帮助你理解(尽管 doseq 是这里惯用的方法)。

其他提示

如@edbond在他的评论中说,地图fn不要在必要时刻评估,因为map fn返回懒人seq。

这是 map fn 返回一个懒惰的序列,包括将f施加到的结果 每个Coll的第一项设置,然后将F应用于集合 每次Coll中的第二个项目,直到任何一个Colls都是 筋疲力尽的。其他Colls中的任何剩余物品都被忽略。功能 f应该接受Colls的参数。

如果您需要确保在代码的一个特定部分中的值为您可以使用 doall dorun

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top