شما در یک کتابخانهی محلی شغلی گرفتهاید و به سازماندهی مجموعهی کتابهای قدیمی آن کمک میکنید. مراجعان دانشجو اغلب دنبال نقلقولهایی میگردند که نیمهیادشان مانده تا در مقالههای ترمشان به آنها استناد کنند. بهجای اینکه همهی کتابها را دستی از جلد تا جلد بخوانید، تصمیم میگیرید ابزار کوچکی بسازید که آنها را بررسی کند و این نقلقولهای ناقص را پیدا کند.
فایلها را برای یافتن خطهایی که با یک رشتهی جستوجو مطابقت دارند جستوجو کنید و همهی خطهای مطابق را برگردانید.
فرمان grep در Unix فایلها را برای یافتن خطهایی که با یک عبارت باقاعده مطابقت دارند جستوجو میکند.
وظیفهی شما پیادهسازی یک فرمان سادهشدهی grep است که از جستوجوی رشتههای ثابت پشتیبانی میکند.
فرمان grep سه آرگومان میگیرد:
سپس محتوای فایلهای مشخصشده را (به همان ترتیبی که مشخص شدهاند) میخواند، خطهایی را که شامل رشتهی جستوجو هستند پیدا میکند و در پایان آن خطها را به همان ترتیبی که پیدا شدهاند برمیگرداند.
هنگام جستوجو در چند فایل، به ابتدای هر خط مطابق، اسم فایل و یک دونقطه (':') اضافه میشود.
فرمان grep از گزینههای زیر پشتیبانی میکند:
-n شمارهی خط و یک دونقطه (':') را به ابتدای هر خط در خروجی اضافه میکند و شماره را بعد از اسم فایل (در صورت وجود) قرار میدهد.-l فقط اسم فایلهایی را خروجی میدهد که دستکم یک خط مطابق دارند.-i مطابقت را با مقایسهای بدون توجه به بزرگی و کوچکی حروف انجام میدهد.-v برنامه را معکوس میکند: همهی خطهایی را که مطابقت ندارند جمع میکند.-x فقط خطهایی را جستوجو میکند که رشتهی جستوجو با کل خط مطابقت داشته باشد.برخلاف تمرینهای دیگر، grep نیازمند تعامل با «دنیای بیرونی» است: خواندن فایلها، مدیریت خطاهای سیستمی و چاپ در stdout.
در Lean، تعامل با سیستم معمولاً در موناد IO انجام میشود، که اجازه میدهد عوارض جانبی در محیطی محدود رخ دهند بدون آنکه وضعیت خالص بیشتر توابع دیگر را تحت تأثیر قرار دهند.
Lean اجازه میدهد یک فایل بهعنوان اسکریپت فراخوانی شود، چه مستقیم بهصورت یک اسکریپت مستقل با lean --run و چه با استفاده از lake.
یک پروژهی Lean یک نقطهی ورود دارد، تابعی به اسم main که یک List String با همهی آرگومانهای ارسالشده به آن میگیرد.
برای شبیهسازی اجرای Grep.lean بهعنوان یک فایل اجرایی، در این تمرین آرگومانها به همین شکل ارسال میشوند.
Lean توابعی برای کار با فایلها در موناد IO.FS ارائه میدهد.
برای مثال، میتوان از IO.FS.readFile استفاده کرد تا محتوای فایلی در یک مسیر مشخص را بهصورت یک String بخواند.
این تمرین بهجای برگرداندن یک مقدار، نوشتن نتایج در خروجی استاندارد یا خطای استاندارد را لازم میداند. توابعی در Lean برای این منظور وجود دارد.
برخلاف خطاها در Except، استثناهای IO در واقع استثناهای زمان اجرا هستند.
میتوانید از try/catch برای مدیریت آنها استفاده کنید:
try
/-
code that may possibly raise an exception
-/
catch msg =>
/-
code that is executed only if an exception was thrown
-/