Computersprachen von A bis Z: Guile
( Tücke d. Übersetzer )

von Gary L. Ratliff, Sr. (eronstuc)

Guile steht für: GNU's allgegenwärtige intelligente Sprache für Erweiterungen. Sie entstand als Folge der 1994 beginnenden Auseinandersetzungen (flame war), als Richard M. Stallman einen Artikel veröffentlichte, in dem er die These vertrat, Tcl solle nicht zum Programmieren verwendet werden. Das System ist Bestandteil einer Standardinstallation mehrerer Versionen von PCLinuxOS. Gegenwärtig wird Version 1.8.6 verwendet. Ich fand diese auch auf einem anderen Computer mit der Version 2007 und auch im System meiner Gnome 2009-2 Installation. Sie dient als Interpreter für die Scheme-Variation von Lisp. Sie bringt eine Bibliothek mit, die in die Kompilationen verschiedener Sprachen (ein)gelinkt werden kann und erlaubt somit ihren Gebrauch als Erweiterung der Sprache.

Da nun Scheme eine Variation von Lisp ist, möchte ich die Gelegenheit nutzen, einige Möglichkeiten von Lisp anzuführen, die sich direkt auf Lisp im Allgemeinen beziehen. Ich habe diese Systeme gefunden und installiert, als ich am Elisp Segment dieser Serie arbeitete. Die eine Sache wird "Lisp in a box" genannt. Hier wird auf der Basis von Slime ein Lisp Entwicklungssystem bereitgestellt. Es enthält einen getrennten Emacs Editor zur Verwendung innerhalb des "in the box" Systems. Es sind auch mehrere Codeabschnitte aus dem Buch "Practical Common Lisp" von Peter Seibel enthalten. Den Buchtext findet man online unter http://www.gigamonkeys.com. Die ander Sache ist eine freie Testversion von LispWorks Personal Edition. Dabei handelt es sich um Version 5.1.1. Sie wird nach Ausfüllen eines Formulars und Zustimmung zu den Bedingungen installiert. Man findet sie unterhttp://www.lispworks.com. Nach der Installation müssen Sie eine Ihrer Bibliotheken umbenennen. Auf solche Einzelheiten werden wir jedoch noch näher eingehen, wenn wir zum Abschnitt Lisp kommen. Oder Sie wenden sich an die genannten Webseiten und werden dort die notwendige Hilfe bei Installationsproblemen erhalten. Da Lisp wahrscheinlich fast vollständig anders ist als alle anderen Sprachen, mit denen Sie bisher gearbeitet haben, werden Sie viel Freude an den beiden genannten Installationen haben, wenn Sie so etwas mögen.

Ich habe auch herausgefunden, dass das Paket umb-scheme offensichtlich standardmässig auf dem System installiert ist. Das System meldet die Version 3.2 und es gibt auch eine Meldung hinsichtlich des Auftretens eines Fatal Error's. Trotz dieser Meldung scheint das System einwandfrei zu funktionieren. Um die Anwendung von Scheme code, den Sie ausprobieren wollen, zu testen, sollte nun einer der folgenden Wege zum Ziel führen. Um den guile Interpreter aufzurufen geben Sie in einer Konsole $guile

oder

$umb<tab> ein.

Das Drücken der "Tab"-Taste erweitert auf den vollen Befehl "umb-scheme". Dieser startet die entsprechenden Programme. Zunüchst: Um guile zu verlassen geben Sie (quit) ein; um das umb-scheme system zu verlassen müssen Sie gleichzeitig die Tasten "ctrl" und "d" drücken. Dies wurde auch beim Start des umb-scheme Programms angezeigt. Umb ist ein Synonym für University of Massachusetts Boston. Beide gehen auf den R5RS Standard der Scheme Lisp Variante zurück. In letzter Zeit wurde der Standard erweitert und der Standard R6RS wurde eingeführt.

Erlernen der Anwendung der Scheme Variante von Lisp und des neuen Standards.

Die letzte Standardversion der Variante wurde im Juli 2009 eingeführt. Heute veröffentlichte Texte nutzen diesen Standard. Das System nutzt jedoch gegenwärtig den R5RS Standard. Ich meine, der grösste Unterschied zu R5RS ist, dass das neue System zwischen Gross- und Kleinbuchstaben unterscheidet. Haben Sie also eine Funktion mit dem Namen foo in Ihrem System, so wird diese aufgerufen, gleichgültig ob Sie foo, Foo,fOo etc. eingeben. Bei Code, der den Neuen Standard verwendet, erlaubt jede unterschiedliche Schreibweise den Aufruf einer anderen, unabhängigen Funktion. Um Scheme zu lernen empfehle ich das Buch von MIT Press, 4. Ausgabe "Die Scheme Programmsprache". Sie können auch die 3. Ausgabe verwenden. Beide wurden von R. Kent Dybvig verfasst. Wenn Sie die Beispiele aus der 4. Ausgabe mit den gegenwärtig auf Ihrem System installierten Versionen von guile oder umb-scheme nutzen wollen, werden Sie mehrere Meldungen über Syntax-Fehler erhalten. Diese treten nicht auf, wenn Sie die Beispiele der 3. Version benutzen, die auf den älteren Standard zurückgehen. Wenn Sie die Eigenschaften des neuesten Standards ausprobieren wollen, haben Sie eine freie Version von Chez Scheme zur Verfügung. Diese gibt es in einer "threaded" und "non threaded" Version sowohl für 32 bit als auch für 64 bit Intel Systeme. Der Name für 32 bit Systeme ist bei der threaded Version: pcsv7.9.3-ti3le.tar.gz; für die non threaded Version pcsv7.9.3-i3le.tar.gz. Es wird auch mitgeteilt, dass eine rpm Version zur Verfügung steht. Es hat sich jedoch herausgestellt dass beim Versuch, die rpm Version zu installieren, die Abhängigkeiten mit libinfo.so.5 nicht aufgelöst wurden. In jedem Fall glaube ich, dass das guile System bald aktualisiert und an die neuen Standards angepasst wird.

Einige interessante Instrumente stehen zur Verfügung. Nehmen wir zum Beispiel die Familie der faktoriellen Funktionen. Diese definiert als faktoriell 0 als identisch 1 und faktoriell n als Ergebnis einer Multiplikation aller ganzen positiven Zahlen von 1 bis n. Das folgende Bildschirmfoto zeigt wie diese Funktion in Scheme definiert wird und wie man ihre Entwicklung verfolgen kann (trace).

Dazu gibt man in guile folgendes ein:

(define fact
   (lambda (x)
      (if (zero? x)
          1
          (* x (fact (1- x))))))

(fact 5)
(trace fact)
(fact 5)
(fact 10)
Bild1

Dies zeigt die Schritte, die der Prozess durchläuft um die Lösung zu finden. Beachten Sie auch, dass "1" eine eigene, unabhängige Funktion darstellt. Wenn Sie wissen wollen was eine Eingabe bedeutet, geben Sie sie einfach mit der Tastatur ein - ohne irgendwelche Klammern. So ergibt z. B. ein + ein einfaches generisches + <primitive-generic +>, ein lambda fährt zu einem <primitive-builtin-macro! Lambda> und ein 1- ergibt eine <primitive-procedure 1->

Nun ist ja eine Funktion der mitgelieferten Bibliothek die einfache Einbindung und Hinzufügung der vollen Funktionalität verschiedener (Computer)Sprachen in eine bestehende Sprache. Auf diese Weise kann der Scheme Interpreter, der von der libguile.so Bibliothek bereitgestellt wird, in ein Programm eingebunden werden das in C++ oder C kompiliert ist. Wie einfach das ist, zeigt ein Beispiel aus dem Tutorial, das nachstehend angeführt ist:

/* test the new libgh.a (Guile High-level library) with a trivial program */
#include <stdio.h>
#include <guile/gh.h>

void main_prog(int argc, char *argv[]);

main(int argc, char *argv[])
   {
      gh_enter(argc, argv, main_prog);
   }

void main_prog(int argc, char *argv[])
   {
      int done;
      char input_str[200];
      gh_eval_str("(display \"hello Guile\")");
      gh_eval_str("(newline)");

/* for fun, evaluate some simple Scheme expressions here */
      gh_eval_str("(define (square x) (* x x))");
      gh_eval_str("(define (fact n) (if (= n 1) 1 (* n (fact (- n 1)))))");
      gh_eval_str("(square 9)");

/* now sit in a Scheme eval loop: I input the expressions, have Guile evaluate them, and then get another expression. */
      done = 0;
      fputs("learn0> ", stdout);
      while (fgets(input_str, 199, stdin) != NULL) {
      gh_eval_str(input_str);
      fputs("\nlearn0> ", stdout);
   }

exit(0);
}

Nennen Sie dieses Programm learn0.c und kompilieren Sie es mit den 2 Durchläufen des gcc Kompilers:

$gcc -c learn0.c -o learn0.o
$gcc -o learn0 learn0.o -lguile -lm.

Das flag -c veranlasst den Kompiler nach dem Erstellen der Objektdatei zu stoppen anstatt weiterzuarbeiten, bis die ausführbare Datei erstellt ist. Das flag -o führt dazu, dass die erzeugte Datei learn0.o genannt wird. Im zweiten Compilerdurchlauf wird diese Datei kompiliert und die Ausgabedatei mit dem Namen learn0 wird mit zwei Bibliotheken verlinkt; der guile Bibliothek und der math Bibliothek. Nachdem dies vollzogen ist, werden Sie sehen, dass die Eingabe von ./learn0 eine Datei startet, die genauso funktioniert, als hätten Sie das Guile Startkommando eingegeben.

Bild2

Hier noch eine weitere ausgezeichnete Quelle um die Scheme Variante von Lisp zu erlernen. Das Buch wurde von MIT Press entwickelt und wird von vielen Universitäten des Landes für den Einführungskurs zur Computerprogrammierung verwendet. Wenn Sie jemals Hacker im Kino gesehen haben, werden Sie sich vielleicht an die Szene erinnern in der der Computer Enthusiast eine Litanei von verschiedennamigen farbigen Computer Handbüchern erwähnt. Nun, dieses ist das lila Buch.

Bild3

Wenn Sie die Seite besuchen und auf den Link für die Dias klicken werden Sie zu einer vollständige Lerneinheit geführt, die in alle Eigenschaften der Scheme Variation von Lisp einführt. Sie haben ziemlich viele Einflussmöglichkeiten, weil die top level Definitionen leicht geändert werden können. Zum Beispiel: Sie haben gelernt, dass 2+3=5 ist und dass dies in Scheme oder guile wie folgt ausgedrückt wird: (+ 2 3).
Nun ist es aber möglich, (define + -) einzugeben und wenn Sie jetzt nach (+ 2 3) fragen, wird die Antwort -1!! sein. Das wäre die Antwort gewesen, wenn Sie (- 2 3) eingegeben hätten. Wenn Sie jetzt ihr System zum Lösen Ihrer Mathehausarbeit verwenden, würden Sie höchstwahrscheinlich durchfallen.

Die einzige Möglichkeit da wieder herauszukommen ist "exit" zu benutzen oder CTRL D.
Dies beendet das System und startet es neu und damit ist auch Ihre Idee einer neuen einfachen Addition verschwunden.

Eine der Hauptanwendungen für guile ist es Programme erweiterbar zu machen. Die Beispiele aus der Dokumentation kompilieren jedoch nicht korrekt. Trotzdem sollte jetzt Ihr Appetit geweckt sein, mehr über dieses System erfahren zu wollen. Die letzte Meldung aus den Computersprachenblogs war, dass Scheme in 2 verschiedene Sprachen aufgespalten werden wird. Die Zeit wird zeigen, ob das stimmt.