在clojure中映射懒惰

时间:2011-11-25 00:12:32

标签: swing map clojure lazy-evaluation

我正在Clojure中构建一个简单的swing GUI。我试图通过在let:

的上下文中使用map将单个函数应用于多个GUI组件

(map #(f % component4) [component1 component2 component3])

组件全部在let中定义。

问题是,map是惰性的,并且动作不会应用于组件,但是,我可以通过将上面的内容包装在“take”中来强制它。

是否有一种非懒惰的地图替代方案?或者我应该以不同的方式解决这个问题?

编辑: 在eclipse中使用逆时针方向。我使用REPL中的(使用'Lib:reload)并使用编辑器中的CTRL + Enter获得了不同的结果。重新加载会启动GUI,但会出现上述问题。从编辑器使用CTRL + Enter时没有出现问题,因此我认为我对问题的描述可能不准确。无论如何,在这种情况下,doseq似乎是更好的替代方案。

3 个答案:

答案 0 :(得分:17)

我挑战你的断言,让take涉及到任何不同。如果您将其包裹在doalldorun中,它会执行您想要的操作,但是您应该考虑使用doseq代替map进行此类仅限副作用的操作

注意

最初发布为对问题的评论;复制以满足大众需求。

答案 1 :(得分:8)

doseq 可能是解决此问题的最佳方法。 doseq大致相当于" for-each"在许多其他语言中循环遍历集合的每个元素的语句。保证不会懒惰。

(doseq 
  [comp [component1 component2 component3]]
  (f comp component4))

一些一般性建议:

  • 当您希望序列作为输出
  • 时,使用地图及其懒惰的朋友(包括拍摄,放弃等)
  • 当您对副作用更感兴趣时,请使用 doseq doall dotimes

答案 2 :(得分:2)

将你的地图包装在一起会强制进行评估。或更好的替代品是剂量q,用于涉及副作用的事物。