Fachkonzept: Reduktion von Ausdrücken
Reduktion von Ausdrücken
Zur Auswertung von Ausdrücken in Racket werden diese schrittweise durch festgelegte Regeln reduziert, bis ein Ausdruck erreicht wird, der nicht weiter reduziert werden kann, zum Beispiel das Endergebnis einer mathematischen Rechnung.
Die Reduktion von Ausdrücken bezeichnet die schrittweise Auswertung
eines Ausdrucks durch festgelegte Reduktionsregeln.
Reduktion beschreibt dabei den Prozess, in welchem ein Ausdruck in einfachere Ausdrücke umgewandelt wird, indem beispielsweise Teilausdrücke ausgewertet werden oder die Ersetzung von Definitionen stattfindet.
Reduktionsregeln umfassen beispielsweise die Reihenfolge, in der Teilausdrücke ausgewertet werden, sowie die Art und Weise,
wie Parameter einer Funktion durch die entsprechenden Übergabedaten ersetzt werden.
Reduktion beschreibt dabei den Prozess, in welchem ein Ausdruck in einfachere Ausdrücke umgewandelt wird, indem beispielsweise Teilausdrücke ausgewertet werden oder die Ersetzung von Definitionen stattfindet.
Eager und Lazy Evaluation
Um Ausdrücke mit Funktionsaufrufen auszuwerten, werden meist eine von zwei gängigen Strategien genutzt:
Eager Evaluation bezeichnet eine Auswertungsstrategie, in
welcher sämtliche
Ausdrücke sofort ausgewertet werden, sobald diese im Programmcode auftreten.
Lazy Evaluation bezeichnet eine Auswertungsstrategie, in welcher Ausdrücke erst dann ausgewertet werden, wenn deren Auswertung für die weitere Verarbeitung zwingend notwendig ist. Die Ergebnisse bereits ausgewerteter Ausdrücke werden gespeichert, um doppelte Auswertungen zu vermeiden.
Lazy Evaluation bezeichnet eine Auswertungsstrategie, in welcher Ausdrücke erst dann ausgewertet werden, wenn deren Auswertung für die weitere Verarbeitung zwingend notwendig ist. Die Ergebnisse bereits ausgewerteter Ausdrücke werden gespeichert, um doppelte Auswertungen zu vermeiden.
Beispielhafte Auswertung:
Schritt | Eager Evaluation | Lazy Evaluation |
---|---|---|
0 | ((lambda (a b) (* a a b)) (- 5 3) (+ 2 4)) |
((lambda (a) (* a a b)) (- 5 3) (+ 2 4)) |
1 | ((lambda (a b) (* a a b)) 2 (+ 2 4)) |
(* (- 5 3) (- 5 3) (+ 2 4)) |
2 | ((lambda (a b) (* a a b)) 2 6) |
(* 2 2 (+ 2 4)) |
3 | (* 2 2 6) |
(* 2 2 6) |
4 | 24 |
24 |