2009-08-21 15 views
8

में ईओएफ तक इनपुट कैसे पढ़ा जाए, मैं लिस्प में ईओएफ तक इनपुट स्ट्रीम कैसे पढ़ूं? सी में, आप इसे इस तरह कर सकते हैं:लिस्प

while ((c = getchar()) != EOF) 
{ 
    // Loop body... 
}  

मैं पहले से डेटा का आकार निर्दिष्ट किए बिना ही मेरी लिस्प कार्यक्रमों के लिए पाइप डेटा करने में सक्षम होना चाहते हैं। यहाँ कुछ से एक उदाहरण मैं अब कर रहा हूँ है:

(dotimes (i *n*) 
    (setf *t* (parse-integer (read-line) :junk-allowed T)) 
    (if (= (mod *t* *k*) 0) (incf *count*))) 

इस पाश में, चर *n*, लाइनों कार्यक्रम के लिए मैं पाइपिंग हूँ की संख्या (मूल्य इनपुट की पहली पंक्ति से पढ़ी जाती है) निर्दिष्ट लेकिन मैं सिर्फ एक मनमानी और अज्ञात संख्या की लाइनों को संसाधित करना चाहता हूं, जो स्ट्रीम के अंत तक पहुंचने पर रोकता है।

उत्तर

9

read-line एक वैकल्पिक तर्क (eof-error-p) यह या तो NIL (डिफ़ॉल्ट) या एक EOF मार, बजाय एक त्रुटि संकेत पर एक उपयोगकर्ता द्वारा निर्दिष्ट मूल्य (eof-value) वापस लौटने का मौका ले जाता है।

Chapter 19 of Successful Lisp से

:

पढ़ें-लाइन & वैकल्पिक धारा EOF-त्रुटि पी EOF-मूल्य पुनरावर्ती-पी

ऊपर सूचीबद्ध पढ़ने कार्यों में, वैकल्पिक तर्क EOF-ERROR-P और EOF-VALUE क्या निर्दिष्ट तब होता है जब आपका प्रोग्राम थका हुआ स्ट्रीम से पढ़ने का प्रयास करता है। यदि EOF-ERROR-P सत्य (डिफ़ॉल्ट) है, तो लिस्प एक थका हुआ स्ट्रीम पढ़ने के प्रयास पर एक त्रुटि सिग्नल करेगा। यदि EOF-ERROR-P शून्य है, तो लिस्प एक त्रुटि सिग्नल करने के बजाय EOF-VALUE (डिफ़ॉल्ट NIL) देता है।

आप इसे अपने फ़ंक्शन के लिए एक सरल समाप्ति स्थिति के रूप में उपयोग कर सकते हैं।

+1

@GustavBertram सुनिश्चित नहीं हैं कि तुम क्या मतलब है के साथ के लिए READ-LINE

(loop for line = (read-line stream nil :eof) ; stream, no error, :eof value until (eq line :eof) do ...) 

या कभी कभी HyperSpec देखें। यह अभी भी सात साल पहले इस लिंक में पोस्ट किए गए लिंक से डाउनलोड के लिए उपलब्ध है। मैंने अभी पुष्टि की। –

13

शून्य

(loop for line = (read-line stream nil nil) 
     while line 
     do ...)