Auswertungsstrategien von Funktionsparametern

Wenn ein Programm eine Funktion aufruft, dann gibt es verschiedene Möglichkeiten, wie mit den Parametern umgegangen werden kann. Genauer gesagt, gibt es drei Unterscheidungen.

Call-by-Value

Bei der Auswertungsstrategie „Call-by-Value“ werden die übergeben Parameter soweit es geht ausgewertet und danach an die Funktion übergeben. Als Beispiel nehme ich folgende Funktion:

def funktion(a,b):
    return 2*a

Der folgende Aufruf würde so aussehen:

funktion(4+2,0) => funktion(6,0) => 12

Wie man sieht, wird zunächst der erste Parameter bis zu einem konstanten Wert (Value) ausgewertet und mit diesem dann die Funktion aufgerufen.

Call-by-Name

Bei „Call-by-Name“ wird der Parameter als Einheit gesehen und entsprechend in der Funktion substituiert. Ein Aufruf derselben Funktion „funktion“ würde so aussehen:

funktion(4+2,0) => 2*(4+2) => 2*6 => 12

Es werden alle Vorkommnisse der Variable „a“ durch „(4+2)“ ersetzt und danach ausgewertet.

Call-by-Need

„Call-by-Need“ zeichnet sich dadurch aus, dass ein Parameter erst ausgewertet wird, falls dieser auch wirklich benötigt wird. So können auch „illegale“ Parameter übergeben werden.

funktion(3,2/0) => 2*(3) => 6

Wie man erkennt, geben wir als zweiten Parameter eine undefinierte Operation an ( Division durch Null). Ein Funktionsaufruf mit der „Call-by-Value“ Strategie würde zum Abbruch führen. Bei „Call-by-Need“ ist das nicht der Fall, da der zweite Parameter in der Funktion nicht genutzt wird, und nicht ausgewertet werden muss.

~ Sebastian