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

unj*_*nj2 7 clojure

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

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

(defn action[]
    (map show '(HELLO Sweet love)))
Run Code Online (Sandbox Code Playgroud)

Bri*_*per 7

map很懒.在强制进行评估之前,不会评估任何内容.要么(dorun (action))使用doseq,要么使用而不是map.


Art*_*ldt 5

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

(dorun .... insert your map here .... )
Run Code Online (Sandbox Code Playgroud)

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

如果您将函数映射到想要保留的结果,那么请使用doseq.