2011-10-10 51 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))) 

感谢塔维斯贾德的修复。