Clojure (read-line) возвращает ноль; не подскажет - PullRequest
5 голосов
/ 02 мая 2011

Я работаю над своей первой правильной программой 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.

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 09 января 2012

Теперь это будет работать с swank-clojure 1.4.0-SNAPSHOT, если вы поместите вызов read-line в swank.core / with-read-line-support следующим образом

(with-read-line-support (println "a line from Emacs:" (read-line))

https://github.com/technomancy/swank-clojure/commit/f4a1eebc4d34f2ff473c4e5350f889ec356f5168

8 голосов
/ 02 мая 2011

read-line не работает в SLIME. Я не могу найти ветку обсуждения по этому поводу, но это правда.

0 голосов
/ 17 апреля 2013

Наконец это сработало для меня:

(swank.core/with-read-line-support
   (read-line))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...