2010-01-09 14 views
28

में stdin (* in *) से लाइनों को कैसे पढ़ा जाए, मैं अपना पहला क्लोजर प्रोग्राम लिख रहा हूं, और stdin से लाइनें पढ़ना चाहता हूं।क्लोजर

जब मैं यह कोशिश: तो कैसे मैं एक में *in* परिवर्तित

Exception in thread "main" java.lang.ClassCastException: clojure.lang.LineNumberingPushbackReader cannot be cast to java.io.BufferedReader (test.clj:0) 

मैं संस्करण 1.0 में एक ही परिणाम और 1.1

मिलती है:

(doall (map #(println %) (line-seq *in*))) 

मैं इस अपवाद seq मैं फिर से कर सकते हैं? मैं सोचा होगा कि इस काफी आम है कि *in* ही iterable होगा है, लेकिन है कि या तो काम नहीं करता है - अगर मैं इसे इस्तेमाल करने की कोशिश सीधे मुझे मिलता है:

java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.LineNumberingPushbackReader (NO_SOURCE_FILE:0) 

इसके अलावा, सामान्य फ़ाइल करने का कोई उदाहरण देखते हैं क्लोजर में हैंडलिंग?

+2

की जगह (मानचित्र # (println%) (लाइन-सेक ..)) बस के साथ (नक्शा println (लाइन-seq ..)) अच्छा हो सकता है – GabiMe

उत्तर

25

java.io.BufferedReader में *in* को लपेटने का प्रयास करें। और यह भी doall के बजाय doseq रूप devstopfix ने बताया उपयोग करते हैं,:

(doseq [ln (line-seq (java.io.BufferedReader. *in*))] 
    (println ln)) 

ध्यान दें कि line-seq एक BufferedReader उसके स्रोत के रूप की आवश्यकता के लिए दर्ज है।

+0

धन्यवाद, यह तय है। –

+2

यह कोड काम नहीं करता है। मुझे त्रुटि मिलती है "doseq को इसके बाध्यकारी के लिए एक वेक्टर की आवश्यकता होती है" कोशिश @devstopfix लिखा था। यह मेरे लिए काम किया। – Jason

+1

@ जेसन इस फ़ॉर्म के लिए डोसक के बजाय डोरुन का उपयोग करें। doseq एक बाध्यकारी रूप की आवश्यकता है। dorun एक आलसी seq मजबूर करता है। – user1009908

19

आप शायद doseq बजाय doall उपयोग करना चाहिए:

(doseq [line (line-seq (java.io.BufferedReader. *in*))] 
    (println line)) 

doall:

इस प्रकार करने के लिए पूरे seq के कारण, seq के लगातार nexts के माध्यम से वॉक्स सिर को बरकरार रखे हुए है और यह देता है, एक समय में स्मृति में रहते हैं।

doseq:

अनुक्रम के सिर को बनाए रखने नहीं है। शून्य वापस आता है।

17

सिर्फ एक नोट कि किसी भी व्यक्ति जो केवल एक पंक्ति पढ़ना चाहता है, वहां read-line फ़ंक्शन है।

0

यथोचित छोटे आदानों के लिए, निम्न भी काम करेगा:

(let [input-string (slurp *in*)] 
    (println input-string)) 

या, लाइनों द्वारा बंटवारे:

(let [lines (clojure.string/split-lines (slurp *in*))] 
    (println lines))