2013-02-16 10 views
14

Z Wikipedii:Jakakolwiek różnica między oceną Lazy a oceną zwarć?

Lazy evaluation jest:

W teorii języków programowania, leniwa ewaluacja lub zadzwonić po potrzebie jest strategia oceny, która opóźnia ocenę wyrazem aż jego wartość jest potrzebne

Short-circuit evaluation jest:

ocena zwarciem, minimalne oceny, czy McCarthy ocena oznacza semantyki niektórych operatorów logicznych w niektórych programowania języków, w których drugi argument jest tylko zrealizowanych lub ocenianych jeśli pierwszy argument nie wystarcza do określenia wartość wyrażenia

Więc jaka jest różnica między nimi, na przykład gdy mam:

if(false && true && true) { 
    //boo 
} 

O ile mi wiadomo, kompilator nie wykonuje wyrażeń po false, ponieważ mam &&, więc całe wyrażenie będzie w końcu oznaczone jako false. (Prawda?)

Więc jest to, że zachowanie nazywa Lazy ocena ocena lub zwarciem?

+0

Masz pewne nieporozumienia dotyczące tego, o czym [parsing] (http://en.wikipedia.org/wiki/Parsing) faktycznie się powołuje. – Gumbo

+0

@Gumbo Edytowane, myślę, że 'wykonujące' jest poprawnym słowem, prawda? –

Odpowiedz

16

Różnica polega na tym, że w przypadku leniwego oceniania wyrażenie jest oceniane tylko wtedy, gdy jest potrzebne, natomiast w przypadku oceny zwarcia ocena oceny kończy się zaraz po poznaniu wyniku. Jest to rodzaj ortogonalnych pojęć.

Do każdego obliczenia można zastosować leniwą ocenę (schemat zwarciowy jest zwykle używany tylko przy sygnalizatorach). Nie wyłącza bezużytecznych obliczeń, ale opóźnia całe obliczenie, aż do uzyskania wyniku.

variable = bigAndSlowFunc() or evenSlowerFnc() 
if (carry out heavy computations) 
    print "Here it is: ", variable 
else 
    print "As you wish :-)" 

Jeśli ocena jest leniwy, variable będą obliczane tylko wtedy, gdy zdecydujemy się pójść do pierwszej (then) oddział if, w przeciwnym razie nie będzie. Na etapie oceny (kiedy przygotowujemy argumenty dla print) można zastosować schemat zwarć, aby zdecydować, czy musimy zadzwonić pod numer evenSlowerFnc.

Tak więc w twoim przykładzie jest to ocena zwarcia, ponieważ nie ma opóźnienia obliczeń.

+0

W rzeczywistości wykorzystanie leniwego oceniania może * czasami * prowadzić do odcięcia bezużytecznych obliczeń. Na przykład podczas pracy z zestawami zapytań Django (https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy) można użyć filtru (lub wykluczyć), aby dostosować kryteria filtrowania tyle razy, ile potrzebujesz: rzeczywiste zapytanie SQL jest uruchamiane tylko wtedy, gdy uzyskujesz dostęp do wyniku. – aruseni

+3

Zgodnie z pierwszym zdaniem, w leniwej ocenie wyrażenie jest oceniane tylko wtedy, gdy jego wartość jest potrzebna. Wynika z tego, że jeśli wartość wyrażenia nigdy nie jest potrzebna, wyrażenie nigdy nie jest oceniane. Rozważmy "f() i & g()';, gdy potrzebna jest wartość tego wyrażenia, jeśli" f() "ma wartość" prawda ", obliczenie wartości' g() 'jest opóźnione, dopóki nie będzie potrzebne. Ponadto 'g()' nie jest obliczane w ogóle, chyba że jest potrzebne. Ocena zwarcia jest prostym przypadkiem leniwej oceny. –

+0

@TheodoreNorvell, w przypadku oceny zwarcia 'g()' jest albo oceniany, albo nie. W ogóle się nie opóźnia. No dobra, nie zostanie wykonana dopóki 'f()' się nie skończy, ale wykonanie od lewej do prawej jest tym, czego można się spodziewać podczas pisania 'f() && g()'. –

Powiązane problemy