====== Lazy-Parameter ======
Folgende Funktion
void func( bool write, int what )
{
if( write )
printf( "%d\n", what );
}
wird gerufen mit
func( false, doComplexMath(a,b) );
Hier wird eine extrem aufwendige Funktion gerufen, die möglicherweise gar nicht benötigt wird.
Zum einen könnte man hier prüfen, dass ''what'' gar nicht benötigt wird und den Call wegoptimieren.
Zum anderen könnte man hier einen Funktionspointer übergeben, der ist aber abhängig von der Anzahl der Parameter. Es muss also ein Funktionsobjekt übergeben werden, dass a und b zwischenspeichert (möglicherweise auch lazy!) und ein Funktionsobjekt übergibt (tuple aus (doComplexMath, a, b) ).
Das alles bitte mit
func( write is bool, what is int lazy )
{
if( write )
printf( "%d\n", what );
}
Beim Aufruf von ''what'' wird das Funktionsobjekt what aufgerufen, also doComplexMath(a,b) ausgeführt und ein ''int'' zurückgegeben. Nachteilig kann das sein bei direkten ints:
func( false, 4711 );
Hier kann man nach Size oder Speed kompilieren, wobei für Speed eine Überladung denkbar ist.
===== Lazy ist const =====
Ein Parameter, der Lazy in die Funktion kommt ist konstant, wird also nur einmalig ausgewertet. Wird der Parameter lazy var beschrieben, so wird er bei jedem Aufruf neu ausgewertet.
===== Expressions =====
Expressions können entweder zur Kompilezeit ausgewertet werden und somit in eine Copy-By-Value-Funktion übertragen werden oder werden ebenfalls in eine Lambda-Funktion gepackt:
func( false, funccall1() && funccall2() );