我在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"))
使用lein run
产生:
Entering -main
ECHO: nil
Exiting -main
换句话说,没有机会在控制台输入文本(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
运行时,我就可以。{/ p>
答案 0 :(得分: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,而不是将其作为子进程启动。
答案 1 :(得分:1)
我遇到了类似的问题,并使用了构建jar文件然后运行它。
lein uberjar
java -jar project-standalone.jar
它有点慢,虽然它让我解开了。从repl那里得到的答案就是 更好
答案 2 :(得分:1)
使用带有-read-line-support的宏来包装你的读取线调用,现在在ns swank.core [自swank-clojure 1.4+以来我相信]:
(use 'swank.core)
(with-read-line-support
(println "a line from Emacs:" (read-line)))
感谢Tavis Judd的解决方案。
答案 3 :(得分:0)
您可以使用 read
并使用字符串作为输入。
答案 4 :(得分:-1)
不确定问题的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 "/"))))