D/Funkcje2
Funkcje czasu wykonania
edytujW przygotowaniu: Kiedy się stosuję. Kilka przykładów. Uproszczenie metaprogramowania. |
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; }
Wersja 2 języka D umożliwia wykonywanie bardzo szerokiej klasy operacji w funkcjach CTFE. |