Kurzbeschreibung (frei nach mir;-) SCSH ist eine in Scheme programmierbare Unix Shell.
Über Vorteile einer "ausgereiften" Programmiersprache möchte ich mich hier nicht auslassen, Olin Shivers hat sie in seinen Kommentaren weitaus besser dargestellt als ich es je könnte. Außerdem bin ich ein News Gruppen gebranntes Kind.
Hier ein Beispiel für die "Schönheit von Programmen". Ja Ihr könnt mich deswegen ruhig ausbuhen ;-)
|
Es handelt sich hierbei um eine Schablone mit der man wirklich eine Unmenge an Operationen auf Dateien abdeckt. Für die Nicht Scheme Eingeweihten unter uns: Mit define (name-of-function parameters ...) wird in Scheme eine Funktion definiert. Es handelt sich dabei schon um eine abkürzende Schreibweise, was aber vernachlässigt werden kann. Der erste Name nach der sich öffnenden Klammer ist der Name der Funktion nachfolgend die Parameter der Funktion.
Bei with-cwd handelt es sich um eine Makro (eine Erweiterung von Scheme). In einem mit with-cwd eingeschlossenen Block wird in das angegebene Directory (hier dir) gewechselt und dort der nachfolgende Code ausgeführt, bei Beendigung des Blockes befindet man sich wieder im gleichen Verzeichnis wie vorher.
Mit for-each steht eine Iterationsmöglichkeit über eine Liste zur Verfügung, for-each erwartet einen Funktion mit einem Parameter und eine Liste die elementweise abgearbeitet wird. Bei der Funktion hier handelt es sich um eine anonyme Funktion die in Scheme (wie auch in Common Lisp) mit (lambda eingeleitet wird. Den einen Parameter der Funktion nenne ich hier file (da ich über eine Datei list iterieren möchte.
Nachfolgend schlägt die Eleganz von HOF (HigherOrderFunction?s) zu. HOFS sind Funktionen, die andere Funktionen als Parameter oder Rückgabewert enthalten. Im Beispiel werden gleich mehrfach verschachtelte HOFS benutzt; action ist eine Funktion mit zwei Paramtern. In unserem Fall arbeitet sie auf dem aktuellen Dateinamen und einem irgendwie veränderten Dateinamen. Nun da es sich auch bei transformer um eine HOF handelte, liegt eine Schablone vor mit der man beliebige Aktionen mit Dateien anstellen kann.
Auf welchen Dateien arbeiten wir nun: Es wird ein Muster übergeben das mit (glob pattern ausgewertet wird. Also so etwas wie ls *.c was mir alle C Dateien in einem Directory auflistet. Statt aber einem Zeichenstrom wird eine Liste von Werten zurückgegeben und genau das benötigen wir für for-each.
Ein Unix Standardbeispiel: Die Umbenennung von allen Dateien in einem Unterverzeichnis in Dateien die nur Kleinbuchstaben enthalten
|
Ich benutze meine Schablone und fülle Sie mit mir genehmen Werten. Diese Lösung für eine Unix FAQ Problem finde zumindest ich wunderschön.
Ich werde immer mal wieder SCSH Lösungen hier vorstellen, ich hoffe einige von Euch lassen sich auch von der "Schönheit" verleiten sich einmal die SCSH anzuschauen.