valutazione normale degli ordini -vs- valutazione dell'applicativo

7

Sto esaminando Abelson e Sussman ( Struttura e interpretazione di programmi per computer ) e sono un po 'confuso su quando viene utilizzata la normale valutazione degli ordini e quando viene utilizzata la valutazione degli ordini applicativi.

Questa frase mi esclude:

Lisp uses applicative-order evaluation partly because of the additional efficiency obtained from avoiding multiple evaluations of expressions suich as those illustrated with (+5 1) and (*5 2) above and, more significantly, because normal-order evaluation becomes much more complicated to deal with when we leave the realm of procedures that can be modeled by substitution. [emphasis added]

su pagina 17, paragrafo 1 .

Tuttavia, nell'esercizio 1.6, l'implicazione è che il Lisp utilizza la normale valutazione degli ordini per le primitive, ma la valutazione degli ordini applicativi per le procedure complesse.

Qualcuno potrebbe chiarire?

    
posta Jonathan Henson 28.02.2012 - 20:58
fonte

2 risposte

7

Primo: ci sono più implementazioni di Lisp, ognuna delle quali può avere diversi modelli di valutazione. Credo che SICP usi principalmente Scheme.

L'esercizio 1.6 non implica che Scheme usi l'ordine normale - si tratta di un modulo speciale ( if ). Per le forme speciali, la valutazione non può essere né di tipo applicativo né normale.

Credo che Scheme usi sempre l'ordine applicativo tranne che nel caso di moduli speciali.

Ad esempio:

(cond (x 1)
      (y 2)
      (else 3))

cond è un modulo speciale. Questo valuterà valutando x , e se è vero, restituisce 1, altrimenti valuta y , restituendo 2 se è vero, altrimenti restituisce 3.

Sono un po 'arrugginito sullo Schema - spero di non aver dimenticato nessuna parentesi! Sono anche consapevole del fatto che ci sono più versioni di Scheme, ma non sono sicuro quale sia utilizzato dal libro.

    
risposta data 28.02.2012 - 22:10
fonte
0

because normal-order evaluation becomes much more complicated to deal with when we leave the realm of procedures that can be modeled by substitution.

Per metterlo diversamente, prendi in considerazione

let x = (print "ha", print "ho") in x

La domanda è, questa stampa a) nulla, b) ha c) ho d) haho?

Lo fa solo la prima volta, o ogni volta che x viene usato?

Con la normale valutazione degli ordini, dipenderebbe dalla quantità di espressione richiesta, come:

y = fst x

Questo è uno dei motivi per cui i linguaggi non rigorosi (cioè l'uso di una forma di valutazione normale dell'ordine che può essere modellato per sostituzione) tendono ad essere puri, cioè non sono ammessi effetti collaterali nelle espressioni.

    
risposta data 07.02.2013 - 15:59
fonte

Leggi altre domande sui tag