2011-10-10 16 views
5

Estoy escribiendo un juego de texto en Clojure. Quiero que el jugador escriba líneas en la consola y que el juego responda línea por línea.Clojure (línea de lectura) no espera la entrada

La investigación me mostró que (read-line) es la forma en que uno está destinado a obtener líneas de texto de entrada estándar en Clojure, pero no funciona para mí.

estoy en un proyecto Leiningen fresco, y he añadido una cláusula :main a la project.clj que apunta hacia el único archivo de origen:

(ns textgame.core) 

(defn -main [& args] 
    (println "Entering -main") 
; (flush)      ;makes no difference if flush are commented out 
    (let [input (read-line)] 
    (println "ECHO:" input)) 
; (flush) 
    (println "Exiting -main")) 

usando lein run rendimientos:

Entering -main 
ECHO: nil 
Exiting -main 

En otras palabras , no hay oportunidad de ingresar texto en la consola para que lea (read-line).

¿Cómo hago para que Clojure espere a que se ingresen los caracteres y la línea nueva y se devuelve la cadena correspondiente?

(estoy usando GNOME 2.32.1 Terminal en Linux Mint 11, Leiningen 1.6.1.1 en Java 1.6.0_26 de Java HotSpot (TM) de 64 bits del servidor VM, Clojure versión 1.2.1.)

actualización : Si ejecuto lein repl, puedo (println (read-line)), pero no cuando tengo una función -main y la ejecuto usando lein run.

+0

posible duplicado de [Clojure (read-line) devuelve nil; no solicita] (http: // stackoverflow.com/questions/5861373/clojures-read-line-returns-nil-does-not-prompt) – amalloy

+0

@amalloy La mejor conjetura en la respuesta a la que se vinculó fue que era un problema con swank-clojure/SLIME. No estoy usando ninguno de esos. – dukereg

+1

¿Ha intentado ejecutar el script directamente con java -cp clojure.jar clojure.main /path/to/myscript.clj para descartar otros problemas y centrarse en los problemas de ejecución de lein? – jneira

Respuesta

1

He tenido problemas similares y he recurrido a crear un archivo jar y luego ejecutarlo.

lein uberjar 
java -jar project-standalone.jar 

Es un poco más lento, aunque me consiguió despegarme. Una respuesta que funciona desde el repl sería mejor

+0

Tienes razón; esto es lento, pero funciona. Parece que lein run tiene algo mal. – dukereg

+2

Las personas con el mismo problema deben tener en cuenta que necesitan (: gen-class) en su declaración de espacio de nombres antes de ejecutar el jar independiente de esta manera. – dukereg

0

No estoy seguro acerca de los aspectos mínimos del problema, pero definitivamente en emacs es imposible hacer el trabajo stdin. Sin embargo, si desea obtener el texto del usuario, puede hacerlo fácilmente utilizando un JOptionPane como el código de mi pequeño programa tic-tac-dedo del pie:

(defn get-input [] 
    (let [input (JOptionPane/showInputDialog "Enter your next move (row/column)")] 
    (map #(Integer/valueOf %) (.split input "/")))) 
6

Try "Lein plazo cama elástica". Ver http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b para más detalles también de https://github.com/technomancy/leiningen:

Q: No tengo acceso a la entrada estándar dentro de mi proyecto.

A: Hay un problema en la biblioteca que Leiningen utiliza para engendrar nuevos procesos que bloquean el acceso a la entrada de la consola. Esto significa que funciones como read-line no funcionarán como se espera en la mayoría de los contextos, aunque la tarea repl necesariamente incluye una solución temporal. También puede usar la tarea de trampolín para iniciar la JVM de su proyecto después de que Leiningen haya salido en lugar de iniciarlo como un subproceso.

1

Envuelva su lectura llamadas de la línea con la macro-con-la línea de apoyo a leer que ahora está en ns swank.core [ya Swank-clojure 1.4+ creo]:

(use 'swank.core) 
(with-read-line-support 
    (println "a line from Emacs:" (read-line))) 
Gracias a

Tavis Judd para la solución.

Cuestiones relacionadas