Clojure(读取行)不';不要等待输入

Clojure(读取行)不';不要等待输入,clojure,console-application,user-input,leiningen,Clojure,Console Application,User Input,Leiningen,我正在用Clojure写一个文字游戏。我希望玩家在游戏机上输入台词,然后游戏会逐行响应 研究表明,(读行)是从Clojure中的标准输入中获取文本行的方式,但它对我不起作用 我在一个新的Leiningen项目中,我在项目中添加了一个:main子句。clj指向唯一的源文件: (ns textgame.core) (defn -main [& args] (println "Entering -main") ; (flush) ;makes

我正在用Clojure写一个文字游戏。我希望玩家在游戏机上输入台词,然后游戏会逐行响应

研究表明,
(读行)
是从Clojure中的标准输入中获取文本行的方式,但它对我不起作用

我在一个新的Leiningen项目中,我在
项目中添加了一个
:main
子句。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"))
使用
lein run
产生:

Entering -main
ECHO: nil
Exiting -main
换句话说,没有机会在控制台输入文本以进行
(读取行)
读取

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

(我在Linux Mint 11上使用GNOME终端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

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

lein uberjar
java -jar project-standalone.jar
它稍微慢了一点,虽然它让我松了一口气。从repl得到的答案是
更好

不确定问题的lein方面,但在emacs中肯定不可能使stdin工作。但是,如果您想从用户那里获取文本,您可以使用JOptionPane轻松地完成,就像我的tic tac toe小程序中的代码:

(defn get-input []
  (let [input (JOptionPane/showInputDialog "Enter your next move (row/column)")]
    (map #(Integer/valueOf %) (.split input "/"))))
试试“莱恩蹦床跑”。有关更多详细信息,请参见:

问:在我的项目中,我没有访问stdin的权限

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


使用ns swank.core中现在提供的具有读取行支持的宏包装您的读取行调用[自swank clojure 1.4+以来,我相信]:

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

感谢Tavis Judd的修复。

您可以使用
读取
并使用字符串作为输入。

可能与@amalloy重复您链接到的答案中的最佳猜测是,这是swank clojure/SLIME的问题。我没有使用这两种方法。您是否尝试过直接使用java-cp clojure.jar clojure.main/path/to/myscript.clj来运行脚本,以放弃其他问题并专注于lein run问题?@jneira lein run似乎有问题。谢谢你的建议,你说得对;这是缓慢的,但它的工作。lein run似乎有点问题。有同样问题的人应该注意,在以这种方式运行独立jar之前,他们需要在名称空间声明中使用(:gen class)。