2011-10-10 78 views
5

我正在用Clojure編寫一個文本遊戲。我希望玩家在控制檯上輸入行數,然後讓遊戲逐行響應。Clojure(讀線)不等待輸入

研究顯示我(read-line)是一種方式來從Clojure的標準輸入中獲取文本行,但它不適合我。

我是在一個新的Leiningen項目,我添加了一個:main條款的project.clj指向只有源文件:使用lein run產量

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

Entering -main 
ECHO: nil 
Exiting -main 

換句話說,沒有機會在控制檯輸入文字(read-line)來閱讀。

我應該如何讓Clojure等待字符和換行符被輸入並返回相應的字符串?

(我在Linux Mint的11使用GNOME終端2.32.1,Leiningen 1.6.1.1關於Java 1.6.0_26 Java的熱點(TM)64位服務器VM,Clojure的版本1.2.1。)

更新:如果我運行lein repl,我可以(println (read-line)),但不是當我有-main函數並使用lein run運行時。

+0

[Clojure(read-line)的可能重複返回nil;不提示](http:// stackoverflow。com/questions/5861373/clojures-read-line-returns-nil-does-not-prompt) – amalloy

+0

@amalloy你連接的答案中的最佳猜測是它是swank-clojure/SLIME的問題。我沒有使用這兩種。 – dukereg

+1

您是否嘗試直接使用java -cp clojure.jar clojure.main /path/to/myscript.clj運行腳本以放棄其他問題並關注lein運行問題? – jneira

回答

1

我有類似的問題,並採取建立一個jar文件,然後運行。

lein uberjar 
java -jar project-standalone.jar 

雖然它讓我感覺不舒服,但速度稍慢。從repl工作的答案將 更好

+0

你是對的;這很慢,但它工作。看起來萊恩運行有問題。 – dukereg

+2

具有相同問題的人應該注意,在以這種方式運行獨立jar之前,他們需要(:gen-class)在其名稱空間聲明中。 – dukereg

0

不確定問題的lein方面,但肯定在emacs中是不可能使stdin工作。但是,如果你想從用戶那裏得到的文本,你可以很容易地做到這一點使用這樣的代碼的JOptionPane從我的小井字棋程序:

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

嘗試「雷音蹦牀運行」。見http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b更多細節也從https://github.com/technomancy/leiningen

問:我沒有我的項目中獲得標準輸入。

答:在Leiningen用來產生阻止訪問控制檯輸入的新進程的庫中存在一個問題。這意味着像readline這樣的函數在大多數情況下都不會像預期的那樣工作,儘管repl任務必須包含一個解決方法。您也可以在Leiningen退出而不是將其作爲子進程啓動後使用蹦牀任務來啓動您的項目的JVM。

1

包裝你讀線與讀線支持宏現在是在納秒調用swank.core [斯旺克以來,Clojure的1.4+我相信]:

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

感謝塔維斯賈德的修復。