سؤال

كيف قرأت دفق الإدخال حتى eof في Lisp؟ في ج، قد تفعل ذلك مثل هذا:

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

أرغب في أن أكون قادرا على توجيه بيانات الأنابيب إلى برامج LISP الخاصة بي دون الحاجة إلى تحديد حجم البيانات مسبقا. إليك مثال من شيء أفعله الآن:

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

في هذه الحلقة، المتغير *n* يحدد عدد الخطوط التي أقوم بها الأنابيب إلى البرنامج (يتم قراءة القيمة من السطر الأول من الإدخال)، لكنني أود فقط معالجة عدد الأسطر التعسفية وغير معروفة، توقف عندما يصل إلى نهاية الدفق.

هل كانت مفيدة؟

المحلول

read-line يأخذ حجة اختيارية (eof-error-p) السماح لها بالعودة أيضا NIL (افتراضي) أو قيمة محددة من المستخدم (eof-value) على ضرب EOF, ، بدلا من الإشارة إلى خطأ.

من عند الفصل 19 من LISP الناجح:

قراءة والدفق الاختياري Eof-Error-P EOF-Value Recursive-P

في وظائف القراءة المذكورة أعلاه، حجج اختيارية EOF-ERROR-P و EOF-VALUE حدد ما يحدث عندما يقوم البرنامج بإجراء محاولة للقراءة من دفق مرهق. لو EOF-ERROR-P صحيح (الافتراضي)، ثم سيتشارة LISP إلى وجود خطأ في محاولة لقراءة دفق مرهق. لو EOF-ERROR-P هو nil، ثم يعود LISP EOF-VALUE (إفتراضي NIL) بدلا من الإشارة إلى خطأ.

يمكنك استخدام هذا كشرط إنهاء بسيط لملكتك.

نصائح أخرى

انظر hyperspec ل قراءة

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

أو في بعض الأحيان مع nil

(loop for line = (read-line stream nil nil)
      while line
      do ... )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top