2016-04-15 10 views
7

私はJavaでClojureに書いた小さなコンソールプログラムを翻訳しようとしていますが、Clojureの標準*out* varとオブジェクトの違いを理解するのに少し問題があります。 System/out。私は彼らが同じものだったという印象を受けていましたが、私のテストの間に彼らは異なっているように見えました。Clojure:* out * vs System/out

私のプログラムでは、ユーザに番号を入力するように指示し、プロンプトと入力テキストを同じ行に入力します。 Javaでは、私はSystem.out.print()とプロンプトを印刷し、スキャナは入力を読み取った。

以下は、Clojureでの私の最初の試みです。 print関数は、入力にread-line前に、その直後にブロックを発射する必要があるように思えるとごちゃ混ぜ混乱で後にすべてのものを印刷しますが:

(defn inp1 [] 
    (print "Enter your input: ") 
    (let [in (read-line)] 
     (println "Your input is: " in))) 

以下は*out*を使用して、私の次の試みでした。これは、上記の関数と同じ問題がある:私の第三の試行で

(defn inp2 [] 
    (.print *out* "Enter input: ") 
    (let [i (read-line)] 
     (println "You entered: " i))) 

、私は最終的に直接System/outを使用して動作するようにそれを得た:

(defn inp3 [] 
    (let [o System/out] 
     (.print o "Enter input: ") 
     (let [i (read-line)] 
      (println "You entered: " i)))) 

私は私が最終的にそれを持ってくれてうれしいです最初の2人がいないときに私が望むやり方で、3人目がうまく動作する理由について、私は深く混乱しています。なぜ最初の2つはすぐにブロックされますか?誰かがこれについていくつかの光を当てることができますか?

the docs当たり

答えて

8

*out* - 印刷操作のための標準的な出力を表すのjava.io.Writerオブジェクト。 OutputStreamWriter

に包まれたシステム/アウトへ デフォルトは、...そう、あなたはラッピングの層を持っています。ドキュメントfor that layer(強調追加)を見て:

write()メソッドを呼び出すたびには、符号化変換器が与えられた文字(複数可)上で起動させます。 結果のバイトは、基本出力ストリームに書き込まれる前にバッファに蓄積されます。このバッファのサイズは指定できますが、デフォルトではほとんどの目的に十分です。 write()メソッドに渡される文字はバッファされないことに注意してください。

...強調が追加されました。 OutputStreamWriterバッファーなので、内容を書き込むには.flushに電話する必要があります。

+0

バッファリングされていることがわかりました。最初に.flushを呼び出す必要があります。私は、あるものが流れであり、もう1つが作家であることを知らなかった。ありがとう! – RGrun