2011-05-02 15 views
5

Estoy trabajando en mi primer programa Clojure adecuado: un juego de ajedrez. Tengo el siguiente:Clojure (línea de lectura) devuelve nil; no indica

(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)))))) 

Nota del lugar donde read-line esté comentada y sustituido por terminal-input. read-line me estaba dando una NullPointerException, por lo que para fines de diagnóstico:

(defn terminal-input [] 
    (println "input") 
    (let [whatnot (read-line)] 
    (println "received" whatnot) 
    whatnot)) 

Entonces, cuando llamo 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 

Nunca tuve la oportunidad de escribir algo como entrada. Si fuera Java, empezaría a jugar pequeños juegos con el recolector de basura (llamando al Scanner.next(), por ejemplo), pero con Clojure no sabía qué hacer además de poner el (flush) allí.

Por lo que vale, esto es con SLIME.


También trató de tener terminal-input proporcionan datos ficticios, y aprendió que estoy usando aparentemente loop/recur incorrectamente. No lo he investigado súper bien, ya que me he distraído con los problemas read-line.

Gracias de antemano.

Respuesta

8

Esto funcionará ahora con Swank-clojure 1.4.0-SNAPSHOT si se coloca la llamada a leer línea en swank.core/a-línea de lectura de apoyo como éste

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

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

+0

Por cierto, también he agregado read-from-minibuffer y y-or-n-p support. –

+0

Eso es bastante asombroso. Espero tener una razón para probar esto. – amalloy

9

read-line no funciona en SLIME. No puedo encontrar el hilo de discusión sobre esto, pero es verdad.

+1

+1 para "pero es verdad". – ponzao

+0

Thud. Um ... ¿hay algún tipo de solución? ¿Valdría la pena jugar juegos con la clase de escáner de Java? – tsm

+0

Eche un vistazo a http://stackoverflow.com/questions/3790889/clojure-lein-read-line-stdin-woes - un poco viejo, pero probablemente útil. – amalloy

0

Finalmente esto funcionó para mí:

(swank.core/with-read-line-support 
    (read-line)) 
Cuestiones relacionadas