2008-12-23 10 views
13

क्लोजर में डबलिंग करते समय मैंने जो भी उपयोगकर्ता टाइप किया है उसे गूंजने के लिए एक बहुत ही बुनियादी कार्यक्रम लिखा है। हालांकि, यह इस तरह से नहीं चलता है कि मैं प्राकृतिक होने वाला महसूस कर रहा हूं।क्लोजर - ऑर्डर से बाहर होने वाले साइड इफेक्ट्स

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

मैं कोड (read-line को इनपुट के रूप में foo में टाइप मेरे लिए) इस तरह चलाने के लिए उम्मीद करेंगे: कोड यह

user=> (goo) 
echo> foo 
foonil 

लेकिन बजाय, गूंज और पढ़ने के लिए लाइन है स्विच किया गया:

user=> (goo) 
foo 
echo> foonil 

ऐसा क्यों होता है? क्या कोई कमी है जो मुझे याद आ रही है?

संपादित करें: जो जवाब से, अद्यतन सही समाधान है:

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

इसके अलावा, flushes आवश्यक नहीं हैं यदि आप println बजाय print का उपयोग करें।

उत्तर

17

मुझे क्लोजर के कुछ भी नहीं पता लेकिन यह बफर के मामले की तरह लगता है जैसे फ्लश नहीं हो रहा है। प्रिंट के बाद मानक आउट फ्लश करने का तरीका जानें। Println फ़ंक्शन शायद प्रत्येक पंक्ति के अंत में flushes। प्रयास करें:

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

कि यह किया! प्रिंट के बाद इसे जोड़ने (फ्लश)। शीघ्र जवाब देने के लिए ध्न्यवाद! –

+2

कूल। अब मेरे पास एक ऐसी भाषा में एक चेक किया गया जवाब है जिसे मैं नहीं जानता। :-) मैं खुशी से मदद कर सकता है। – jmucchiello

+0

अच्छा कौशल! क्लोजर को जानता है जो किसी से जिज्ञासा से बाहर है लेकिन stdout buffers के आंतरिक कामकाज नहीं ... यह समस्या बिल्कुल क्यों होती है? अजीब लगता है कि आदेश एक बफर के भीतर बदला जा सकता है ..... – mikera

13

इसके अलावा, कृपया "def" का प्रयोग नहीं करते जब तक आप वास्तव में, वास्तव में एक वैश्विक चर को परिभाषित करना चाहते। का प्रयोग करें "चलो" के बजाय:

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

या, छोटे

(defn goo [] 
    (print "echo> ") 
    (flush) 
    (print (read-line)) 
    (flush)) 
संबंधित मुद्दे