Funkcje czasu wykonania

edytuj

W rozdziale o funkcjach wspomnieliśmy, że pewne funkcja można wykonać już w trakcie kompilacji, to jest przed wykonaniem samego programu. Tutaj omówimy ten problem szerzej.

Niektóre funkcje mogą zostać wykonane jeszcze w czasie kompilacji (tzw. CTFE - compile-time function evaluation) - przydaje się to przy obliczaniu pewnych stałych wartości, jak i tworzeniu kodu programów do użycia przez mixiny (mówimy wtedy o metaprogramowaniu, piszemy funkcje która stworzy kod, lub cześć kodu, który potem dopiero używamy - tzn. piszemy program, który wygeneruje program),

Aby funkcja mogła zostać wykonana w czasie kompilacji, wszystkie jej parametry muszą być stałe lub dostępne w trakcie kompilacji. Funkcja wykonywana w czasie kompilacji nie może wykorzystywać klas, plików, operacji wejścia/wyjścia, ani zmiennych globalnych. Nie może też wykonywać alokacji dynamicznej pamięci. Może natomiast wykorzystywać inne funkcje, które nie naruszają powyższych zasad. Dodatkowo, wykonanie takiej funkcji musi się odbywać w kontekście, który to wymusi, np. przypisanie do stałej.

Przykład:

// funkcja która może nie narusza zasad
int sqr(int a) { return a*a; }
const x = sqr(5);      // wykona się w trakcie kompilacji
const y = sqr(x);      // wykona się w trakcie kompilacji
int main() {
   writefln(sqr(5));                 // w trakcie wykonania
   writefln(eval!(sqr(5)));          // w trakcie kompilacji
   const y = 6;
   const x2 = sqr(y);                // w trakcie kompilacji (na pewno?)
   int y2 = 6;
   const x3 = sqr(y2);               // w trakcie wykonania
}
template eval(E) { alias E eval; }