2014-01-11 25 views
1

对第一人称问好的工作很好,为什么不说 - 你好对大家?如何在矢量上执行带有副作用的功能?

 
(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"]) 
+1

请参阅'doall'和'dorun'函数。 'doseq'也许是你想要的。 – edbond

回答

3

你想doseq,Clojure的“的foreach”:

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

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

另一种选择是通过围绕map围绕dorun进行强制评估。思考为什么这个作品可以帮助你理解(尽管doseq是这里的惯用方法)。

2

由于@edbond在他的评论中说,地图fn不会评估,直到必要的时刻,因为地图fn返回一个懒惰的seq。

这是map FN 返回由将f应用到 组的每个COLL的第一项目的结果的懒惰序列的文档,接着将f应用到在每个COLL第二项目组 ,直到任何一个colls都是 用尽。其他colls中的任何剩余项目都将被忽略。函数 f应该接受colls数量的参数。

如果您需要确保该值是评估在你的代码中的一个特定部分,你可以使用doalldorun

+0

或(last(map side-effect-fn!) - 会导致lazy-seq被实现,虽然这不被认为是好的做法,因为它不能解释它自己,实际上我甚至不知道为什么我' m烦躁地说这个;-) – Hendekagon