【问题标题】:Why doesnt Clojure execute this function at all?为什么 Clojure 根本不执行这个函数?
【发布时间】:2023-03-13 16:05:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

    map 很懒惰。除非您强制对其进行评估,否则不会对其进行评估。 (dorun (action)) 或使用 doseq 代替 map

    【讨论】:

      【解决方案2】:

      map 函数实际上并不在集合的每个成员上运行映射函数。而是返回一个“懒惰的”单元格。这看起来很像您的经典单链表,但有一个非常重要的区别,每个单元格中的数据是在读取时计算的,而不是在定义时(这个结果当然是存储的供以后阅读)。所以为了让函数真正运行,你必须读取函数运行的结果。因为在这种情况下你不关心函数的结果,只关心它运行 clojure 提供了一个很棒的包装函数,称为

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

      这将创建地图,读取结果并立即将它们丢弃,而不会浪费内存以供以后存储。

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

      【讨论】:

      • 感谢您的详细回答。所有的列表抽象都是惰性的吗?我怎么知道哪些是,哪些不是?
      • 我相信它们都是反向的,尽管向量有一个 (rsec [1 2 3]) 函数,它从末尾开始创建一个秒,通常可以解决这个问题。
      猜你喜欢
      • 1970-01-01
      • 2016-07-03
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2022-01-02
      相关资源
      最近更新 更多