4.1.2. Evaluierung
Evaluierung ist der 2. Schritt in der fuzzy:Praxis mit der REPL[REPL]. Bei Lisp ist es essentiell, zu verstehen, wie genau die Evaluierung stattfindet.
4.1.2.1. Werte und Seiteneffekte
Die Evaluation eines Lisp Ausdrucks kann aus zwei Gründen stattfinden:
Ermittlung eines Wertes
Wie der Name schon sagt, wird in diesem Fall ein Ausdruck aufgerufen, um einen Wert zu ermitteln.
(+ 3 4 5) ;; -> 12 (list 1 2 3 4) ;; -> (1 2 3 4) (expt 2 5) ;; -> 32 (if (< 2 3) 'kleiner 'groesser) ;; -> kleiner
Wenn es sich um verschachtelte Ausdrücke handelt, werden bei der Evaluation die Ausdrücke von innen nach aussen ausgewertet und das Ergebnis der Evaluation ersetzt den Ausdruck. Erst anschließend wird der nächsthöhere Ausdruck evaluiert. Dieser Vorgang wiederholt sich, bis in der obersten Klammerebene nur noch Atome stehen, die anschließend evaluiert werden und das Gesamtergebnis liefern:
;;; Die Evaluation passiert in mehreren Stufen, bei der sukzessiv die ;;; Ausdrücke von innen nach aussen evaluiert und ihre Ergebnisse an ;;; Stelle des ausgewerteten Ausdrucks eingesetzt werden: (+ 3 4 (* 7 (- 5 2))) ;;; |-----| ;;; v (+ 3 4 (* 7 3 )) ;;; |-----------| ;;; v (+ 3 4 21 ) |-------------------| ;;; v 28
Erzeugung eines Seiteneffektes
Ein Seiteneffekt liegt dann vor, wenn die Evaluation eines Ausdrucks Auswirkungen hat, die ausserhalb des Ausdrucks eine Relevanz besitzen. Hierzu zählen beispielsweise das Spielen einer Note mit einem externen Programm, das Lesen oder Schreiben von Dateien auf der Festplatte, das Definieren oder Setzen einer globalen Variable oder die Ausgabe von Text (beispielsweise in der REPL):
;;; Definition einer globalen Variable (defparameter *globale-Variable* 34) ;; -> *globale-Variable* *globale-Variable* ;; -> 34 ;;; Verändern des Wertes einer globalen Variable (setf *globale-Variable* 71) ;;-> 71 *globale-Variable* ;; -> 71 (print "Hallo Welt") ;; -> "Hallo Welt"
4.1.2.2. Formen (forms)
Eine 'form' ist, grob gesagt, ein Ausdruck, der evaluiert werden kann, ohne einen Fehler zu produzieren. Sie lassen sich grob in vier Klassen einteilen:
4.1.2.3. Selbstevaluierende Formen
sind Formen, die zu sich selbst evalueieren
4.1.2.4. Funktionsaufrufe
Daruner versteht man s-expressions, die als erstes Element einen Funktionsnamen enthalten.
4.1.2.5. Listen als Daten
4.1.2.6. special form
Sind eine s-expression mit einer besonderen Syntax. Solche Formen werden in der Regel durch eine 'Makrodefinition' definiert. Die Möglichkeit der Definition von Makros bildet ein Alleinstellungsmerkmal der Sprache Lisp, da sie ermögliht, eine spezielle Syntax von Lisp Ausdrücken zu definieren.