2011-10-10 13 views
5

Piszę grę tekstową w Clojure. Chcę, żeby gracz pisał linie na konsoli, a gra odpowiadała liniowo.Clojure (read-line) nie czeka na dane wejściowe

Badania wykazały, że (read-line) jest sposobem, w jaki można uzyskać linie tekstu ze standardowego wejścia w Clojure, ale to nie działa dla mnie.

Jestem w świeżym projekcie Leiningen i dodałem :main klauzuli do project.clj skierowaną do jedynego pliku źródłowego:

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

wykorzystaniem lein run plonów:

Entering -main 
ECHO: nil 
Exiting -main 

Innymi słowy , nie ma możliwości wprowadzania tekstu na konsoli, aby przeczytać (read-line).

Jak ustawić Clojure, aby czekał na wprowadzenie znaków i linii i zwrócił odpowiedni ciąg znaków?

(używam GNOME Terminal 2.32.1 na Linux Mint 11, Leiningen 1.6.1.1 na Java 1.6.0_26 Java HotSpot (TM) 64-bitowy serwer VM, Clojure wersji 1.2.1.)

Aktualizacja : Jeśli uruchomię lein repl, mogę (println (read-line)), ale nie, gdy mam funkcję -main i uruchomić przy użyciu lein run.

+0

możliwy duplikat [Clojure (read-line) zwraca zero; nie pyta] (http: // stackoverflow.com/questions/5861373/clojures-read-line-return-nil-does-not-prompt) – amalloy

+0

@amalloy Najlepszym domysłem w odpowiedzi, z którą się łączyłeś, było to, że był to problem z swank-clojure/SLIME. Nie używam żadnego z nich. – dukereg

+1

Czy próbowałeś uruchomić skrypt bezpośrednio z java -cp clojure.jar clojure.main/path /to/myscript.clj, aby odrzucić inne problemy i skupić się na problemach z uruchamianiem linii? – jneira

Odpowiedz

1

Miałem podobne problemy i uciekałem się do budowania pliku JAR i uruchomienia go.

lein uberjar 
java -jar project-standalone.jar 

Trochę wolniej, mimo że mnie odepchnął. Odpowiedź, która działa z repliki, byłaby lepsza. Lepsza

+0

Masz rację; to jest powolne, ale działa. Wygląda na to, że bieg w Lein coś z nim nie tak. – dukereg

+2

Osoby z tym samym problemem powinny pamiętać, że potrzebują (: klasa gen) w deklaracji przestrzeni nazw przed uruchomieniem samodzielnego słoika w ten sposób. – dukereg

0

Nie jestem pewien co do leinowych aspektów problemu, ale zdecydowanie w emacs nie da się zrobić stdin pracy. Jednakże, jeśli chcesz uzyskać tekst od użytkownika, można łatwo zrobić to za pomocą tego kodu JOptionPane jak z mojego małego programu Kółko i krzyżyk:

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

Try „Lein bieg trampolina”. Zobacz http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b więcej szczegółów również z https://github.com/technomancy/leiningen:

Q: Nie mam dostępu do standardowego wejścia wewnątrz mojego projektu.

A: W bibliotece występuje problem, którego używa Leiningen do odrodzenia nowych procesów blokujących dostęp do wejścia konsoli. Oznacza to, że funkcje takie jak read-line nie będą działały zgodnie z oczekiwaniami w większości kontekstów, chociaż zadanie replikacji musi zawierać obejście. Możesz również użyć zadania trampolinowego, aby uruchomić maszynę JVM projektu po zakończeniu pracy Leiningena, zamiast uruchamiać ją jako podproces.

1

owinąć odczytu linia nazywa się makro z odczytane-line-wsparcia, które jest teraz w ns swank.core [od Swank-clojure 1.4+ wierzę]:

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

Dzięki Tavis Judd o naprawę.

Powiązane problemy