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-Bit Server VM、Clojure バージョン 1.2.1 で Leiningen 1.6.1.1 を使用しています。)

更新: を実行するlein replと できますが、関数があり、 を使用して実行する(println (read-line))場合はできません。-mainlein run

4

5 に答える 5

6

「レイントランポリンラン」に挑戦。詳細については、 https : //github.com/technomancy/leiningenからもhttp://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9bを参照してください。

Q: プロジェクト内の stdin にアクセスできません。

A: Leiningen がコンソール入力へのアクセスをブロックする新しいプロセスを生成するために使用するライブラリに問題があります。これは、read-line のような関数がほとんどのコンテキストで期待どおりに機能しないことを意味しますが、repl タスクには必ず回避策が含まれています。また、トランポリン タスクを使用して、プロジェクトの JVM をサブプロセスとして起動するのではなく、ライニンゲンが終了した後に起動することもできます。

于 2012-03-01T22:48:44.760 に答える
2

私は同様の問題を抱えており、jarファイルを作成してから実行することに頼りました。

lein uberjar
java -jar project-standalone.jar

動けなくなりましたが、少し遅くなりました。replから機能する答えの方が良いでしょう

于 2011-10-10T19:21:00.557 に答える
1

read-line 呼び出しをマクロ with-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 に感謝します。

于 2012-05-27T18:35:15.453 に答える
-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 に答える