为什么Clojure根本没有执行此功能?

时间:2009-07-23 17:43:22

标签: clojure

我有一个名为show的函数,它显示了一条带有消息的对话框。我需要将此函数映射到alist中的所有项目。但Clojure并没有向我显示任何消息。我做错了什么?

(defn show[message]
 (. javax.swing.JOptionPane (showMessageDialog nil message)))

(defn action[]
    (map show '(HELLO Sweet love)))

2 个答案:

答案 0 :(得分:7)

map很懒。在强制进行评估之前,不会评估任何内容。 (dorun (action))或使用doseq代替map

答案 1 :(得分:5)

map函数实际上并不在集合的每个memeber上运行映射函数。而是它返回一个'lazy-cons'单元格。这看起来很像你的经典单链表,但有一个非常重要的区别,每个单元格中的数据是在读取时计算的,而不是定义的时间(当然这个结果是存储的)以后阅读)。因此,为了使函数实际运行,您必须读取运行函数的结果。因为在这种情况下你不关心函数的结果只是它运行clojure提供了一个很好的包装函数叫做

(dorun .... insert your map here .... )

将创建地图,读取结果并立即将它们扔出去,浪费内存存储它们以供日后使用。

如果您要将函数映射到想要保留的结果,请改用doseq。