【问题标题】:Handling stdin Clojure处理标准输入 Clojure
【发布时间】:2017-08-15 03:03:36
【问题描述】:

以下似乎不起作用,但我不太清楚为什么。所有移动板所做的就是接收一个二维数组并返回一个二维数组,其余的代码都在那里。基本上我正在尝试完成类似以下python的事情:

While True:
  do stuff
  if gameover:
    print("Game Over!")
    break

不工作的 Clojure(打印板一次,要求输入,然后挂起)

(defn game-loop [board]
  (loop [b board]
    (if (game-over? b) "Game Over!"
        (do (print-board b)
            (recur (move-board (read-line) b))))))

【问题讨论】:

  • 您可以尝试单独绑定(让)read-line 的结果并将其打印出来以查看 read-line 是否返回。另一个要检查的地方是您的 game-over? 函数;它会无限重复吗?

标签: clojure stdin


【解决方案1】:

我们需要查看您的其他功能在做什么。一世 将它们最小化到看起来可能的程度,并重新缩进 if 分支更清晰。你的loop 也是不必要的。

(defn game-over? [b] false)
(defn print-board [b] (println b))
(defn move-board [ln b] (println "moving board:" ln))

(defn game-loop [b]
  (if (game-over? b)
    "Game Over!"
    (do (print-board b)
        (recur (move-board (read-line) b)))))

(game-loop :bored)

使用前三个函数,您的循环将按预期运行: 无限提示单行。好吧,至少第一个 时间,但随后您的“挂起”问题被重现。

这可能是由this issue with the JVM 引起的。还有discussed here

【讨论】:

  • 我排除了移动板,因为它调用了许多其他功能,我不得不发布大部分程序。我可以向您保证,它可以正常工作。您假设的基本没问题,唯一的区别是最终板将处于终端状态并停止递归。 printboard 只是将 print 映射到每一行。
  • 所以 - 这是因为我在 emacs/cider 中运行它。当我做 lein run (不必蹦床跑)时,它可以工作。猜猜毕竟没有问题,但我会为你的努力标记这是正确的:)
猜你喜欢
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多