第一人称打招呼效果很好,为什么不对每个人打招呼?
(定义部分问候 [姓名] [:p.警报"你好"名字",你好吗?(定义说你好[姓名] (附加$content(问候语名称)))(对第一人称打招呼[名字] (打招呼(名字)))(对大家打招呼[姓名] (地图说你好名字))(向第一人称打招呼["克里斯"汤姆"吉姆"洛基"])(向大家打招呼["克里斯"汤姆"吉姆"洛基"])
你想要doseq
,Clojure的"foreach":
(doseq [name names]
(say-hello name))
map
不起作用,因为它会产生一个惰性序列:在您实际访问序列中的项目(您在此处没有)之前,不会评估它们中的任何一个,并且不会发生副作用。
另一种选择是通过将dorun
包裹在map
上来强制评估。思考为什么这可能有助于您的理解(尽管这里的惯用方法doseq
)。
正如@edbond在他的评论中所说,map fn 直到必要的时刻才进行评估,因为 map fn 返回一个懒惰的 seq。
这是地图fn的文档 返回一个惰性序列,该序列由将 f 应用于 每个 coll 的第一项的集合,然后将 f 应用于集合 每个 Coll 中的第二个项目,直到任何一个 Coll 是 用尽。其他列中的任何剩余项都将被忽略。功能 f 应该接受列数参数。
如果需要确保在代码的一个特定部分中计算值,则可以使用 doall 或 dorun