كيفية قراءة المدخلات حتى eof في lisp
-
19-09-2019 - |
سؤال
كيف قرأت دفق الإدخال حتى 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، ثم يعود LISPEOF-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 ... )