我正在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似乎是更好的替代方案。
答案 0 :(得分:17)
我挑战你的断言,让take
涉及到任何不同。如果您将其包裹在doall
或dorun
中,它会执行您想要的操作,但是您应该考虑使用doseq
代替map
进行此类仅限副作用的操作
最初发布为对问题的评论;复制以满足大众需求。
答案 1 :(得分:8)
doseq 可能是解决此问题的最佳方法。 doseq大致相当于" for-each"在许多其他语言中循环遍历集合的每个元素的语句。保证不会懒惰。
(doseq
[comp [component1 component2 component3]]
(f comp component4))
一些一般性建议:
答案 2 :(得分:2)
将你的地图包装在一起会强制进行评估。或更好的替代品是剂量q,用于涉及副作用的事物。