处理标准输入 Clojure

Handling stdin Clojure

下面的似乎不起作用,但我不太清楚为什么。 move-board 所做的只是接受一个二维数组和 return 一个二维数组,其余代码都在那里。基本上我正在尝试完成类似以下的事情 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))))))

我们需要看看您的其他功能在做什么。我 将它们最低限度地制作成看起来可能的样子,并重新制作 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)

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

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