首页 文章

Clojure(读取行)不等待输入

提问于
浏览
5

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

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

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

(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 运行时 .

4 回答

  • 1

    我有类似的问题,并采取 Build 一个jar文件然后运行它 .

    lein uberjar
    java -jar project-standalone.jar
    

    它有点慢,虽然它让我解开了 . 从repl开始的答案会更好

  • 6

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

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

  • 1

    使用带有读取线支持的宏来包装您的读取线调用,现在在ns swank.core [自swank-clojure 1.4我相信]:

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

    感谢Tavis Judd的修复 .

  • -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 "/"))))
    

相关问题