2012-11-17 13 views
7

Come si legge un singolo tasto dal terminale (non Swing) in Clojure?Lettura ingresso tastiera senza buffer in Clojure

Ho provato alcune cose tra cui variousversions della libreria JLine, ma non l'ho ottenuto funzionante (vedi esempio sotto).

Accetterò volentieri un esempio di lavoro, Unix-only (Mac, Linux, ...). Idealmente mi piacerebbe sapere come spegnere il buffering sia per stdin che per stdout.

Ecco qualcosa di simile:

;; project.clj dependencies: 
;; [[org.clojure/clojure "1.4.0"] 
;; [jline/jline "2.8"]]) 

(ns slosh.core 
    (:import [jline.console ConsoleReader]) 
    (:gen-class))  

(defn -main [] 
    (println "start") 
    (let [cr (ConsoleReader.)] 
    (.readCharacter cr) 
    (println "done"))) 

Questa stampe "inizio", ma non risponde ad alcun input, tranne control-C.

risposta

5

Non sono sicuro di come si sta eseguendo questo, ma se si utilizza lein run, si incontreranno problemi. Prova a utilizzare lein trampoline run.

Vorrei collegare Single character console input in java/clojure ma non ho abbastanza Punti Internet per farlo.

+0

'lein trampoline run' funziona davvero, così come l'esecuzione da überjar. Qualche idea per cui uno lavora e non l'altro? – JohnJ

+1

La funzione 'sh' usata con' lein run' si aggancia solo 'out' e' err' del progetto viene eseguito come sottoprocesso (consultare https://github.com/technomancy/leiningen/blob/master/leiningen-core /src/leiningen/core/eval.clj#L155). 'trampoline' fa in modo che il progetto venga eseguito come un processo indipendente con i suoi' in', 'out' e' err' collegati dalla shell. – johnwayner

+0

Fantastico, grazie! – JohnJ

Problemi correlati