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