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
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. –
@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
Grazie per la tua spiegazione. –