6

我正在用 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

4

5 回答 5

6

试试“lein蹦床跑”。有关更多详细信息,请参见http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b也来自https://github.com/technomancy/leiningen

问:我无法访问项目中的标准输入。

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

于 2012-03-01T22:48:44.760 回答
2

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

lein uberjar
java -jar project-standalone.jar

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

于 2011-10-10T19:21:00.557 回答
1

用现在在 ns swank.core 中的宏 with-read-line-support 包装你的 read-line 调用 [因为我相信 swank-clojure 1.4+]:

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

感谢 Tavis Judd 的修复。

于 2012-05-27T18:35:15.453 回答
0

您可以使用read和使用字符串作为输入。

于 2021-03-24T14:02:51.757 回答
-1

不确定问题的 lein 方面,但绝对在 emacs 中不可能使 stdin 工作。但是,如果您想从用户那里获取文本,您可以使用 JOptionPane 轻松完成,就像我的小井字游戏中的代码一样:

(defn get-input []
  (let [input (JOptionPane/showInputDialog "Enter your next move (row/column)")]
    (map #(Integer/valueOf %) (.split input "/"))))
于 2011-10-11T03:53:40.423 回答