2011-01-08 26 views
14

Per quanto ne so, la valutazione ansioso/ordine applicativo valuta tutti gli argomenti di una funzione prima di applicarlo, d'altra parte, la valutazione pigra/ordine normale valuta gli argomenti solo quando necessario.valutazione Eager/ordine applicativo e la valutazione pigra/ordine normale

Quindi, quali sono le differenze tra la coppia di termini valutazione desiderosi e ordine applicativa, e valutazione pigra e ordine normale?

Grazie.

risposta

8

valutazione pigro valuta un periodo al massimo una volta, mentre il normale ordine lo valuterà come spesso come appare. Così, per esempio, se si dispone di f(x) = x+x e si chiama come f(g(42)) poi g(42) viene chiamato una volta in fase di valutazione pigri o ordine applicativa, ma due volte sotto ordine normale.

Eager valutazione e ordine applicativo sono sinonimi, almeno quando si utilizza la definizione di ordine applicativo trovato in Struttura e Interpretazione dei programmi per elaboratore, che sembra corrispondere al tuo. (Wikipedia definisce l'ordine applicativo in modo un po 'diverso e lo ha come un caso speciale di valutazione entusiasta).

+1

Sì, sto leggendo * SICP *. Ho seguito il link di Wikipedia e ho trovato questo in [Lazy evaluation] (http://en.wikipedia.org/wiki/Lazy_evaluation): "L'espressione non viene mai valutata più di una volta, chiamata valutazione dell'ordine applicativo." Ciò significa che l'ordine applicativo potrebbe anche essere usato come sottotipo di valutazione pigra? Sono un po 'confuso. –

+2

@Ryan: Apparentemente la pagina "Valutazione pigra" utilizza una diversa definizione di ordine applicativo rispetto alla pagina "Strategia di valutazione". Penso che in questo caso è meglio ignorare Wikipedia e andare con ciò che dice SICP. – sepp2k

+0

Grazie per la tua spiegazione. –

5

sto leggendo SICP troppo, e sono stato incuriosito dalla definizione del normale ordine dato dagli autori. Mi è sembrata piuttosto simile alla valutazione Lazy, quindi sono andato a cercare ulteriori informazioni su entrambi.

So che questa domanda è stata posta molto tempo fa, ma ho guardato le FAQ e non ho trovato alcuna risposta a rispondere alle vecchie domande, quindi ho pensato di lasciare ciò che ho trovato qui in modo che altre persone potessero usarlo in il futuro.

Questo è quello che ho trovato, e io sono incline a concordare con quelli:

direi (come hanno fatto altri) che la valutazione pigro e NormalOrderEvaluation sono due cose diverse; la differenza è di cui sopra. In valutazione pigra, calcolo dell'argomento è differito fino è necessario, a questo punto l'argomento viene valutata e il suo risultato salvato (memoized). Ulteriori usi dell'argomento nella funzione utilizzano il valore calcolato. Gli operatori C/C++ ||, & & e? : sono entrambi esempi di valutazione lazy. (A meno che qualche novizio C/C++ programmatore è abbastanza sciocco sovraccaricare & & o ||, nel qual caso i versioni di overload vengono valutati in modo rigoroso, che è il motivo per cui la & & e || operatori non dovrebbero mai essere sovraccaricato in C++).

In altre parole, ogni argomento è valutata al massimo una volta, forse non affatto.

NormalOrderEvaluation, d'altra parte, rivaluta l'espressione ogni volta che viene utilizzata. Pensate a C macro, CallByName in lingue supporto, e la semantica di looping strutture di controllo, ecc valutazione normale ordine può richiedere molto più lungo di applicativo di valutazione ordine , e può causare effetti indesiderati per accadere più di una volta. (è per questo, ovviamente, le dichiarazioni con effetti collaterali in genere dovrebbe non essere passati come argomenti alle macro in C/C++)

Se l'argomento è invariante e non ha effetti collaterali, l'unica differenza tra i due è la prestazione. In effetti, in un linguaggio funzionale puramente , eval lazy può essere visualizzato come un'ottimizzazione della valutazione dell'ordine normale. Con gli effetti collaterali presenti o le espressioni che possono restituire un valore diverso quando rivalutati, i due hanno un comportamento diverso ; normale eval ordine, in particolare, ha una cattiva reputazione in linguaggi procedurali a causa della difficoltà di ragionamento su tali programmi senza ReferentialTransparency

Va inoltre osservato che la valutazione rigoroso ordine (così come pigri di valutazione) può essere raggiunto in una lingua che supporta la valutazione dell'ordine normale tramite memoing esplicito. L'opposto non è vero; richiede passaggio di thunk, funzioni o oggetti che possono essere chiamati/messaggati per rinviare/ripetere la valutazione.

E

valutazione pigro combina la valutazione normale ordine e la condivisione:

• valutare Mai qualcosa fino a quando è necessario (normale-ordine)

• Non valutare qualcosa di più una volta (condivisione)

http://c2.com/cgi/wiki?LazyEvaluation

http://cs.anu.edu.au/student/comp3610/lectures/Lazy.pdf