Я работаю над своей первой правильной программой Clojure - игрой в шахматы.У меня есть следующее:
(defn human-move [board]
(board-utils/print-board board)
(print "Enter your move, like this: 'E7 E5' ...")
(loop [raw-move (terminal-input)] ;;(read-line)]
(println "I just received" raw-move)
(if (re-matches #"[A-H][1-8]\s[A-H][1-8]" raw-move)
(parse-move raw-move)
(do
(println "Invalid format! There should be a letter, number, space, letter, and final number.")
(print "Try again: ")
(recur (read-line))))))
Обратите внимание на место, где read-line
закомментировано и заменено на terminal-input
.read-line
давал мне исключение NullPointerException, поэтому для диагностических целей:
(defn terminal-input []
(println "input")
(let [whatnot (read-line)]
(println "received" whatnot)
whatnot))
Затем, когда я звоню human-move
.
...
+---+---+---+---+---+---+---+---+
| P | P | P | P | P | P | P | P |
+---+---+---+---+---+---+---+---+
| R | N | B | Q | K | B | N | R |
+---+---+---+---+---+---+---+---+
Enter your move, like this: 'E7 E5' ...input
received nil
I just received nil
, у меня никогда не было возможности что-то набрать вв качестве ввода.Если бы это была Java, я бы начал играть в маленькие игры с сборщиком мусора (например, вызывая Scanner.next()
), но с Clojure я не знал, что делать, кроме того, что помещал туда (flush)
.
Для чего это стоит, это с SLIME.
Я также попытался terminal-input
предоставить фиктивные данные, и узнал, что я, очевидно, неправильно использую loop
/ recur
.Я не исследовал это очень тщательно, так как меня отвлекли проблемы read-line
.
Заранее спасибо.