Swing 在clojure中映射懒惰

Swing 在clojure中映射懒惰,swing,map,clojure,lazy-evaluation,Swing,Map,Clojure,Lazy Evaluation,我正在Clojure中构建一个简单的swing GUI。我试图通过在let的上下文中使用map将单个函数应用于多个GUI组件: (map#(f%component4)[component1 component2 component3]) 其中所有组件都在let中定义 有问题的是,map是惰性的,并且该操作不应用于组件,但是,我可以通过将上面的内容包装成一个“take”来强制它 是否有一个非懒惰的地图替代品?还是我应该换一种方式 编辑: 在eclipse中逆时针使用。我在REPL中使用(使用'Li

我正在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似乎是map的更好替代方案。

将您的map包装在doall中将强制对其进行评估。或者一个更好的选择是doseq,它用于涉及副作用的事情

我对你的断言提出质疑,你认为让
参与进来会有任何不同。如果你把它封装在代码> DOALL 或<代码> DOUNN 中,它会按照你的要求去做,但是你应该考虑使用<代码> DOSeq < /COD>而不是使用<代码> MAP<代码>来进行这种仅对副作用的动作。
注
最初作为对问题的评论发布;复制以满足大众的需求。

可能是最好的方法。doseq大致相当于一个“for-each”语句,它在许多其他语言中循环遍历集合的每个元素。它保证不懒惰

(doseq 
  [comp [component1 component2 component3]]
  (f comp component4))
一些一般性建议:

  • 当您想要一个序列作为输出时,请使用map及其懒惰的朋友(包括take、drop等)
  • 当您对副作用更感兴趣时,请使用doseqdoalldotimes

谢谢,这很有效。语法对于我想做的事情也更有效。我不明白。如果你接受了所有的元素,你不强迫实现它们吗?我不是说doall etc不是更好,但我想3号也行吗?啊!我从来都不知道这一点,但事实上:(首先(需要10000(map#)(do(Thread/sleep 10)%)(range)))返回得非常快。@AdrianMouat它实际上实现了32个元素,因为range和map都是分块的,所以需要0.32秒。但是
(首先(取10000(map#)(do(Thread/sleep 10%)(repeat 1))
会像预期的那样在0.01秒后返回。我确实想知道为什么它会超时(在tryclj.com上)而睡眠值更高。谢谢,今天早上我学到了很多:)经验法则:副作用?在名称中查找
do