2012-06-04 7 views
7

El problema es que cuando ejecuto mi programa con lein run, llego a la parte (read-line) y no puedo salir de él, lo que significa que la línea de lectura nunca regresa.¿Por qué la línea de lectura no regresa después de presionar ENTRAR (parece un bloqueo) usando lein run, pero funciona con lein repl?

Este es el código correspondiente:

(def command (atom "")) 

(defn print-prompt [] 
    (print "prompt> ") 
    (flush) 
) 

(defn ask-for-input [] 
    (print-prompt) 
    (let [x (str (read-line))] 
     (println (str "User input: " x)) 
     (reset! command x) 
    ) 
) 

nunca ver la "entrada del usuario:" cadena en la pantalla. Lo extraño es, si me quedo lein repl y llamo (ask-for-input) entonces funciona correctamente: S

+0

comando de qué? ¿Considerarías editar tu publicación original y ponerla? Estoy tratando de construir tu código y echarle un vistazo. Creo que sé lo que es, pero sería lindo verlo. Gracias. – octopusgrabbus

+0

@octopusgrabbus Ahí, agregué la línea faltante. – Deleteman

+0

En la copia de respuesta, ¿cómo se llama esto? Acabo de ingresar (preguntar por entrada). Es cierto que tengo mi área configurada como un proyecto. Voy a publicar el proyecto y el encabezado src en mi respuesta como una edición. – octopusgrabbus

Respuesta

12

Trate Lein trampolín plazo, funciona.

Lo siguiente es de Leiningen FAQ:

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

A: Esta es una limitación de los métodos de manejo de procesos de la JVM; ninguno de ellos expone stdin correctamente. 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.

+0

Sí lo hace! ¿Ahora te importaría explicar por qué es eso? :) – Deleteman

+0

Supongo que lein trampoline funciona, porque los datos están siendo eliminados. – octopusgrabbus

+0

¡Gracias por la edición! Volvería a votar, pero no puedo :( – Deleteman

0

He probado el código fuente, pero he omitido el color. Funcionó sin problemas. ¿Qué versión de Clojure estás usando? Probé el siguiente código con Clojure 1.3.

(def command (atom 0)) 

(defn print-prompt [] 
    (print "prompt> ") 
) 

(defn ask-for-input 
    [] 
    (print-prompt) 
    (let [x (str (read-line))] 
     (println (str "User input: " x)) 
     (reset! command x) 
    )) 

Editar: alteré una de sus funciones que he copiado y probado con, y funciona ahora con independiente y correr Lein. Tuviste (flush) en tu ejemplo original.

(defn print-prompt [] 
    (print "prompt> ") 
    (flush) 
) 

De lo que puedo reunir, println provoca un color, impresión no lo hace, y lo que necesita un lavado después de la impresión.

Estoy agregando esta información en caso de que pueda ser de ayuda. Tengo un proyecto Clojure llamado repl-test. Aquí está el encabezado del archivo core.clj de mi proyecto de réplica. Su fuente, ya publicada, está en este archivo con algunas otras funciones, no relacionadas con su publicación.

(ns repl-test.core 
    (:gen-class) 
    (:use clojure.contrib.command-line) 
    (:require [clojure.contrib.string :as cstr]) 
    (:require [clojure.contrib.trace :as ctr]) 
    (:require [clojure.string :as sstr]) 
    (:use clojure-csv.core)) 

Y aquí es el archivo project.clj:

(defproject repl-test "0.0.1-SNAPSHOT" 
    :description "TODO: add summary of your project" 
    :dependencies [[org.clojure/clojure "1.3.0"] 
       [org.clojure/clojure-contrib "1.2.0"] 
       [clojure-csv/clojure-csv "1.2.4"] 
       [org.clojure/tools.cli "0.1.0"] 
       [clj-http "0.1.3"]] 
    :aot [repl-test.core] 
    :main repl-test.core) 
+0

Estaba usando 1.3 y cambié a 1.4 para ver si eso ayudaría, pero no lo hizo. – Deleteman

+0

Agregue mi proyecto y los encabezados core.clj. – octopusgrabbus

+0

El mismo trato, recuerde que en Repl funciona, si hago 'lein repl' y luego llamo a' (-main) 'el programa funciona correctamente, pero si lo ejecuto con' lein run' la línea de lectura nunca regresa. Por cierto, mi corazón ES funciona correctamente con la opción de trampolín ... ¿sabes por qué? – Deleteman

Cuestiones relacionadas