2012-06-04 5 views
7

Il problema è che quando eseguo il mio programma con lein run arriva alla parte (read-line) e non riesco a uscirne, ovvero: read-line non restituisce mai.Perché il read-line non ritorna dopo aver premuto ENTER (sembra un blocco) usando lein run, ma funziona con lein repl?

Ecco il codice rilevante:

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

ho mai vedere il "input dell'utente:" stringa su schermo. La parte strana è che se corro lein repl e chiamo (ask-for-input) allora funziona correttamente: S

+0

comando di Cosa? Prenderesti in considerazione la possibilità di modificare il post originale e di inserirlo? Sto cercando di creare il tuo codice e dargli un'occhiata. Penso di sapere di cosa si tratta, ma sarebbe bello vederlo. Grazie. – octopusgrabbus

+0

@octopusgrabbus Lì ho aggiunto la linea mancante. – Deleteman

+0

Al lein repl, come si chiama questo? Ho appena inserito (ask-for-input). Devo ammettere che ho la mia area allestita come un progetto. Pubblicherò il progetto e l'intestazione di src nella mia risposta come una modifica. – octopusgrabbus

risposta

12

Prova Lein trampolino corsa, funziona.

Quello che segue è da Leiningen FAQ:

D: Non ho accesso a stdin all'interno del mio progetto.

A: questa è una limitazione dei metodi di gestione dei processi della JVM; nessuno di questi espone stdin correttamente. Ciò significa che funzioni come read-line non funzioneranno come previsto nella maggior parte dei contesti, sebbene l'attività repl includa necessariamente una soluzione alternativa. Puoi anche utilizzare l'attività trampolino per avviare la JVM del tuo progetto dopo che è uscito Leiningen anziché lanciarlo come sottoprocesso.

+0

Sì, lo fa! Ora ti andrebbe di spiegare perché è così? :) – Deleteman

+0

La mia ipotesi è che le trampoline di lein funzionino, perché i dati vengono cancellati. – octopusgrabbus

+0

Grazie per la modifica! Vorrei votare nuovamente, ma non posso :( – Deleteman

0

Ho provato il codice sorgente, ma ho omesso lo svuotamento. Ha funzionato senza problemi. Quale versione di Clojure stai usando? Ho provato il seguente codice 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) 
    )) 

Edit: ho modificato una delle tue funzioni che ho copiato e testato con, e funziona ora con standalone ed eseguire Lein. Hai avuto (a filo) nel tuo esempio originale.

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

Da quello che posso raccogliere, println provoca un colore, la stampa non lo fa, e avete bisogno di un filo dopo stampa.

Sto aggiungendo queste informazioni nel caso in cui potrebbe essere di aiuto. Ho un progetto Clojure chiamato repl-test. Ecco l'intestazione del file core.clj del mio repl-test project. La tua fonte, già pubblicata, si trova in questo file con alcune altre funzioni, non correlate al tuo post.

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

E qui è il file 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

Stavo usando 1.3 e sono passato a 1.4 per vedere se sarebbe stato d'aiuto, ma non lo è stato. – Deleteman

+0

Aggiungere il mio progetto e le intestazioni core.clj. – octopusgrabbus

+0

Lo stesso problema, ricorda che su Repl funziona, se faccio 'lein repl' e poi chiama' (-main) 'il programma funziona correttamente, ma se lo eseguo con' lein run' la riga di lettura non ritorna mai. A proposito il mio core sta funzionando correttamente con l'opzione trampolino .. ti capita di sapere perché? – Deleteman