2016-04-15 6 views
7

मैं एक छोटे से सांत्वना कार्यक्रम मैं Clojure में जावा में लिखा अनुवाद करने के लिए कोशिश कर रहा हूँ, लेकिन मैं एक छोटे से परेशानी Clojure के मानक *out* वर और कम से वस्तु के बीच अंतर पता लगाना हो रही है System/out। मैं इस धारणा के तहत था कि वे एक ही बात थे, लेकिन जब मेरे परीक्षण के दौरान वे अलग दिखते थे।Clojure: * बाहर * बनाम सिस्टम/बाहर

मेरा कार्यक्रम में मैं एक नंबर दर्ज करने के लिए संकेत है, और मैं शीघ्र और पाठ दर्ज एक ही लाइन पर होना चाहता हूँ। जावा में, मैंने System.out.print() के साथ प्रॉम्प्ट मुद्रित किया और फिर एक स्कैनर इनपुट पढ़ा।

निम्नलिखित मेरी Clojure में कुछ इसी तरह का पहला प्रयास था। जैसे कि यह read-line से पहले, यह तुरंत इनपुट पर ब्लॉक सक्रिय किया जाना चाहिए print समारोह लगता है और एक गड़बड़ गड़बड़ में सब कुछ के बाद प्रिंट हालांकि:

(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)))) 

मुझे खुशी है कि मैं अंत में इसे करने के लिए मिल गया हूँ काम, लेकिन मैं गहराई से उलझन में हूं कि क्यों तीसरा व्यक्ति जिस तरह से चाहता है जब मैं चाहता हूं कि पहले दो न हों। पहले दो ब्लॉक तुरंत क्यों करते हैं? क्या कोई इस पर रोशनी डाल सकता है?

उत्तर

8

प्रति the docs:

*out* - एक java.io.Writer वस्तु प्रिंट के संचालन के लिए मानक उत्पादन का प्रतिनिधित्व। सिस्टम/करने के लिए चूक बाहर, एक OutputStreamWriter

में लिपटे ... हां, तो आप रैपिंग की एक परत है। डॉक्स for that layer (जोर जोड़ा) को देखते हुए:

एक लिखने से प्रत्येक मंगलाचरण() विधि एन्कोडिंग कनवर्टर दिया चरित्र (ओं) पर लागू किया जा करने के लिए कारण बनता है। परिणामस्वरूप बाइट अंतर्निहित आउटपुट स्ट्रीम में लिखे जाने से पहले एक बफर में जमा किए जाते हैं। इस बफर का आकार निर्दिष्ट किया जा सकता है, लेकिन डिफ़ॉल्ट रूप से यह अधिकांश उद्देश्यों के लिए पर्याप्त है। ध्यान दें कि लिखने वाले वर्ण() विधियों को बफर नहीं किया गया है।

... जोर जोड़ा। OutputStreamWriter बफर के बाद, आपको लिखित सामग्री को बल देने के लिए .flush पर कॉल करने की आवश्यकता है।

+0

अब मुझे लगता है कि यह buffered है, और मुझे पहले इसे कॉल करने की आवश्यकता है। मुझे एहसास नहीं हुआ कि एक धारा थी और दूसरा लेखक था। धन्यवाद! – RGrun