Du hast einen Job in einer örtlichen Bibliothek angenommen und hilfst dabei, die Sammlung alter Bücher zu ordnen. Die Studierenden, die dort lesen, suchen oft nach halb vergessenen Zitaten, die sie in ihren Hausarbeiten anführen wollen. Statt jedes Buch von Hand von vorne bis hinten zu lesen, beschließt du, ein kleines Tool zu bauen, das die Bücher durchsucht und nach diesen Zitatfragmenten sucht.
Durchsuche Dateien nach Zeilen, die zu einem Suchstring passen, und gib alle passenden Zeilen zurück.
Der Unix-Befehl grep durchsucht Dateien nach Zeilen, die zu einem regulären Ausdruck passen.
Deine Aufgabe ist es, einen vereinfachten grep-Befehl zu implementieren, der die Suche nach festen Strings unterstützt.
Der grep-Befehl nimmt drei Argumente entgegen:
Anschließend liest er den Inhalt der angegebenen Dateien (in der angegebenen Reihenfolge), findet die Zeilen, die den Suchstring enthalten, und gibt diese Zeilen schließlich in der Reihenfolge zurück, in der sie gefunden wurden. Bei der Suche in mehreren Dateien wird jeder passenden Zeile der Dateiname und ein Doppelpunkt (':') vorangestellt.
Der grep-Befehl unterstützt die folgenden Flags:
-n Stellt jeder Zeile in der Ausgabe die Zeilennummer und einen Doppelpunkt (':') voran und setzt die Nummer hinter den Dateinamen (falls vorhanden).-l Gibt nur die Namen der Dateien aus, die mindestens eine passende Zeile enthalten.-i Vergleicht ohne Berücksichtigung der Groß- und Kleinschreibung.-v Kehrt das Programm um: Sammelt alle Zeilen, die nicht passen.-x Sucht nur nach Zeilen, in denen der Suchstring mit der gesamten Zeile übereinstimmt.Anders als bei anderen Übungen erfordert grep die Interaktion mit der „externen Welt“: Dateien lesen, Systemfehler behandeln und auf stdout schreiben.
In Lean interagierst du normalerweise über die IO-Monade mit dem System. Sie erlaubt Seiteneffekte in einer gekapselten Umgebung, ohne den reinen Zustand der meisten anderen Funktionen zu beeinflussen.
In Lean kannst du eine Datei als Skript aufrufen, entweder direkt als eigenständiges Skript über lean --run oder mithilfe von lake.
Ein Lean-Projekt hat genau einen Einstiegspunkt, eine Funktion namens main, die eine List String mit allen übergebenen Argumenten entgegennimmt.
Um den Aufruf von Grep.lean als ausführbares Programm zu simulieren, werden die Argumente in dieser Übung genauso übergeben.
Lean bietet Funktionen, um Dateien in der IO.FS-Monade zu bearbeiten.
Zum Beispiel kannst du mit IO.FS.readFile den Inhalt einer Datei unter einem gegebenen Pfad als String lesen.
Statt einen Wert zurückzugeben, verlangt diese Übung, dass die Ergebnisse auf die Standardausgabe oder die Standardfehlerausgabe geschrieben werden. In Lean gibt es dafür Funktionen.
Anders als Fehler in Except sind IO-Ausnahmen tatsächlich Laufzeitausnahmen.
Du kannst try/catch verwenden, um sie zu behandeln:
try
/-
code that may possibly raise an exception
-/
catch msg =>
/-
code that is executed only if an exception was thrown
-/
Melde dich bei Exercism an, um Lean mit 100 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.