14

Clojure に手を出している間に、ユーザーが入力した内容をエコーする非常に基本的なプログラムを作成しました。しかし、それは私が自然だと認識している方法では実行されません。コードは次のとおりです。

(defn goo []
  (print "echo> ")
  (def resp (read-line))
  (print resp)
)

コードが次のように実行されることを期待します(へfooの入力として入力する場合read-line):

user=> (goo)
echo> foo
foonil

ただし、代わりに、エコーと読み取り行が切り替えられます。

user=> (goo)
foo
echo> foonil

なぜこれが起こるのですか?私が見逃している機微はありますか?

編集:ジョーの答えから、更新された正しい解決策は次のとおりです。

(defn goo []
  (print "echo> ")
  (flush)
  (def resp (read-line))
  (print resp)
  (flush)
)

printlnまた、代わりにを使用する場合、フラッシュは必要ありませんprint

4

2 に答える 2

18

私はclojureについて何も知りませんが、これはバッファがフラッシュされない場合のように聞こえます。印刷後に標準出力をフラッシュする方法を見つけてください。println 関数は、おそらく各行の終わりでフラッシュします。試す:

(defn goo []
  (print "echo> ")
  (flush )
  (def resp (read-line))
  (print resp)
)
于 2008-12-23T03:08:00.300 に答える
14

また、本当にグローバル変数を定義したい場合を除いて、「def」は使用しないでください。代わりに「let」を使用してください。

(defn goo []
  (print "echo> ")
  (flush)
  (let [resp (read-line)]
    (print resp)
    (flush)))

または、より短い

(defn goo []
  (print "echo> ")
  (flush)
  (print (read-line))
  (flush))
于 2009-03-20T11:08:36.097 に答える