Wartościowanie leniwe

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

Wartościowanie leniwe (ang. lazy evaluation, ewaluacja leniwa) - strategia wyznaczania wartości argumentów funkcji tylko wtedy, kiedy są potrzebne (na żądanie).

Zaletami tego podejścia są możliwość obliczenia wartości funkcji nawet wtedy, gdy nie jest możliwe wyznaczenie wartości któregoś z jej argumentów, o ile tylko nie jest on używany, wzrost wydajności dzięki uniknięciu wykonywania niepotrzebnych obliczeń oraz możliwość tworzenia nieskończonych struktur danych. Wadą wartościowania leniwego jest to, że mogą nie wystąpić (być może oczekiwane) skutki uboczne procesu wyznaczania wartości argumentów.

Przeciwieństwem wartościowania leniwego jest wartościowanie zachłanne, stosowane w większości popularnych języków programowania.

Przykładem wartościowania leniwego jest obsługa operatorów logicznych w większości języków programowania. Wyrażenie postaci (w C):

a = funkcja_B(b) || funkcja_C(c) ? b : c;

Spowoduje przypisanie do zmiennej a wartości b nastąpi gdy:

funkcja_B(b) zwróci prawdę, wtedy funkcja_C(c) nie zostanie wykonana
funkcja_B(b) zwróci fałsz, a funkcja_C(c) zwróci prawdę

W pierwszym przypadku nie nastąpi wywołanie funkcji funkcja_C(c) w związku z czym nie nastąpią jej efekty uboczne. W podobny sposób wykonany zostanie kod:

a = funkcja_B(b) && funkcja_C(c) ? b : c;

Przypisanie do zmiennej a wartości c nastąpi gdy:

funkcja_B(b) zwróci fałsz, wtedy funkcja_C(c) nie zostanie wykonana
funkcja_B(b) zwróci prawdę, a funkcja_C(c) zwróci fałsz

Z tego typu leniwego wartościowania korzysta idiom perla postaci:

funkcja(X) || die("mamy problem");

Który oznacza, że jeżeli funkcja(X) nie zwróci prawdy, to znaczy, że mamy problem i należy zakończyć wykonanie programu.

Jednak oba wzmiankowane powyżej języki dokonują zachłannej ewaluacji wywołań funkcji, ponieważ w obu językach wartości argumentów funkcji są obliczane przed jej wykonaniem.

Przykładami języków stosujących leniwe wartościowanie są Haskell oraz D.

Zobacz też[edytuj | edytuj kod]