我有一个名为show的函数,它显示了一条带有消息的对话框。我需要将此函数映射到alist中的所有项目。但Clojure并没有向我显示任何消息。我做错了什么?
(defn show[message]
(. javax.swing.JOptionPane (showMessageDialog nil message)))
(defn action[]
(map show '(HELLO Sweet love)))
答案 0 :(得分:7)
map
很懒。在强制进行评估之前,不会评估任何内容。 (dorun (action))
或使用doseq
代替map
。
答案 1 :(得分:5)
map函数实际上并不在集合的每个memeber上运行映射函数。而是它返回一个'lazy-cons'单元格。这看起来很像你的经典单链表,但有一个非常重要的区别,每个单元格中的数据是在读取时计算的,而不是定义的时间(当然这个结果是存储的)以后阅读)。因此,为了使函数实际运行,您必须读取运行函数的结果。因为在这种情况下你不关心函数的结果只是它运行clojure提供了一个很好的包装函数叫做
(dorun .... insert your map here .... )
将创建地图,读取结果并立即将它们扔出去,浪费内存存储它们以供日后使用。
如果您要将函数映射到想要保留的结果,请改用doseq。