Clojure(读取行)不等待输入

duk*_*reg 5 user-input clojure console-application leiningen

我正在Clojure写一个文本游戏.我希望玩家在控制台上输入线条,并让游戏逐行响应.

研究表明,这(read-line)是一种在Clojure中从标准输入中获取文本行的方式,但它对我不起作用.

我在一个新的Leiningen项目中,我已经添加了一个指向唯一源文件的:main子句project.clj:

(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"))
Run Code Online (Sandbox Code Playgroud)

使用lein run产量:

Entering -main
ECHO: nil
Exiting -main
Run Code Online (Sandbox Code Playgroud)

换句话说,没有机会在控制台输入文本(read-line)进行阅读.

我应该如何让Clojure等待输入字符和换行符并返回相应的字符串?

(我在Linux Mint 11上使用GNOME Terminal 2.32.1,在Java 1.6.0_26 Java HotSpot(TM)64位服务器VM上使用Leiningen 1.6.1.1,Clojure 1.2.1版.)

更新:如果我跑lein repl,我可以(println (read-line)),但不是当我有一个-main功能并运行使用lein run.

Dan*_*ero 6

试试"lein trampoline run".有关详细信息,请参阅http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b,网址https://github.com/technomancy/leiningen:

问:我无法访问项目中的stdin.

答:Leiningen用来生成阻止访问控制台输入的新进程的库中存在问题.这意味着像read-line这样的函数在大多数情况下都不会按预期工作,尽管repl任务必然包含一个变通方法.您也可以使用trampoline任务在Leiningen退出后启动项目的JVM,而不是将其作为子进程启动.


Art*_*ldt 2

我也遇到过类似的问题,并求助于构建一个 jar 文件,然后运行它。

lein uberjar
java -jar project-standalone.jar
Run Code Online (Sandbox Code Playgroud)

虽然速度慢了一点,但还是让我摆脱了困境。从 repl 中得到的答案会更好

  • 遇到同样问题的人应该注意,在以这种方式运行独立 jar 之前,他们需要在名称空间声明中添加 (:gen-class) 。 (2认同)