【问题标题】:Nothing happen inside my Clojure loop在我的 Clojure 循环中什么也没有发生
【发布时间】:2012-04-02 20:00:23
【问题描述】:

当我执行如下循环时,我有一个根本不想工作的小代码:

...

    (defn my-function []
        (println "Hi")   ;this works
        (for [i (range 10)] (println "Hello")  ;this doesn't work!
          )
    )

...

我不明白问题出在哪里,循环内的所有代码似乎都被忽略了,而“Hi”打印没有问题

我通过 GUI 按钮事件调用“myfunction”,如下所示:

...
    (.append output-text (with-out-str  (time (my-function))))
...

您认为问题可能出在 GUI 上还是我遗漏的其他问题上?有什么建议吗? 我知道我应该使用 REPL 来测试它,但它不适用于 Netbeans...:S

非常感谢您的帮助。

【问题讨论】:

  • 另外值得注意的是,clojure 中的 for 与 C 中的 for 循环并不完全相同。相反,它做了一些称为“列表理解”的事情 - 查看文档并使用一些示例如果你想弄清楚。
  • Netbeans clojure 支持开发处于中断状态,我建议看看 Eclipse 和 CounterClockwise。
  • @NielsK 感谢您的建议,不幸的是,我在尝试安装 Eclipse 插件时遇到了各种问题,最终我选择了 Netbeans,但我会再试一次。谢谢!

标签: loops clojure for-loop


【解决方案1】:

for 宏是惰性的,因此除非确实需要返回值,否则它不会调用您的函数。

请改用doseq 函数。它将强制评估您的代码,因此并不懒惰。它具有与for 相同的“语法”,并允许您考虑诸如println 之类的副作用函数。

【讨论】:

    【解决方案2】:

    另一种方法是使用“dorun”,如果我记得正确的话,dorun 是在你产生副作用时假装的(比如 println)。 该函数应如下所示:

    (defn my-function[]
      (println "Hi")
      (dorun (for [i (range 10)] (println "Hello"))))
    

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      相关资源
      最近更新 更多