Eager
let x = A in 3 valuto sempre anche se so che viene 3.
Lazy
Come cambia la definizione di ambiente in lazy o eager? in eager le variabili hanno un valore associato, mentre in lazy possono avere associate anche espressioni non ancora valutate.
Lazy dinamico
(x,5)(y,x)(x,9) ⊢ 9 → 9 (x,5)(y,x)(x,9) ⊢ x → 9
─────────────────────── ───────────────────────
(x,5)(y,x)(x,9) ⊢ y → 5 (x,5)(y,x)(x,9) ⊢ 1 → 1
─────────────────────────────────────────────────────────
(x,5)(y,x)(x,9) ⊢ y + 1 →
─────────────────────────────────────────────────────────
(x,5)(y,x) ⊢ let x = 9 in y + 1 →
─────────────────────────────────────────────────────────
(x,5) ⊢ let y = x in let x = 9 in y + 1 →
─────────────────────────────────────────────────────────
∅ ⊢ let x = 5 in let y = x in let y = x in let x = 9 in y + 1 →
Lazy statico
Statico: risoluzione variabili tempo di compilazione Dinamico: avviene a tempo di esecuzione
Portarsi un ambiente appresso corrisponde a far comportare uno scoping dinamico come statico.
E(x (M, E)) ⊢ N → v
──────────────────────
E ⊢ let x = M in N → V
Gli ambienti devono portare dentro altri ambienti.
x 5 ∅ ⊢ x → 5
─────────────────────────────────────────────────────────
E(x 9 E) ⊢ y → E(x 9 E) ⊢ 1 → 1
─────────────────────────────────────────────────────────
E(x 9 E) ⊢ y + 1 →
─────────────────────────────────────────────────────────
E
(x 5 ∅)(y x (x 5 ∅)) ⊢ let x = 9 in y + 1 →
─────────────────────────────────────────────────────────
(x 5 ∅) ⊢ let y = x in let y = x in let x = 9 in y + 1 →
─────────────────────────────────────────────────────────
∅ ⊢ let x = 5 in let y = x in let y = x in let x = 9 in y + 1 →
(fa 6)
lazy statico = eager (vale solo in Exp)
todo impagina
let x = 3 in 2
let x = 2 in 3
let x = 3+1 in x+9
let y = 5 in let x= 3+y in x+y
let x = 3 in x+1non è ambiguo perché il + è associativo.let x = 3 in let x = 2 in x+xè ambiguo, perchè non si sa se intendiamolet x = 3 in (let x = 2 in x)+xolet x = 3 in let x = 2 in (x+x).let x = (let x = x in x) in 3- da errori se lo scoping è statico.
- va bene nello scoping dinamico, ma va in loop infinito, quindi va bene, ma:
- se la valutazione è lazy, da 3.
- se la valutazione è eager, va in loop.
Esercizio
Scoping statico e valutazione eager.
let x = (let y = M in N) in L
let y = M in (let x = N in L)
sono logicamente equivalenti?
L sta nello scope di y, quindi se nell’espressione di L c’è y o è associato a qualcosa nell’envirnment di x o porta due definizioni contraddittorie.
todo aggiungi teorema Free
- eager
- lazy ingenua (la lazyness tirava fuori un comportamento dinamico)
- lazy statica (recuperiamo il comportamento operazionale della semantica eager)
è possibile dimostrare che lazy statica = eager (dimostrazione sulle note) nel caso in cui c’è un linguaggio semplice.
Esempi di valutazione
let x = 3 in x+1Non è ambiguo poiché l’operatore è associativo e la struttura sintattica standard lega illetverso destra.let x = 3 in let x = 2 in x+xAmbiguo, poiché la precedenza strutturale non specifica se debba essere inteso come:let x = 3 in (let x = 2 in x) + xlet x = 3 in (let x = 2 in (x + x))let x = (let x = x in x) in 3- Scoping Statico: Genera un errore (la variabile interna non è definita o vi è unuso non valido).
- Scoping Dinamico: Sintatticamente viene accettato, ma durante la valutazione va in loop infinito (cattura ricorsivamente se stessa).
- Con valutazione Lazy: Restituisce
3, perché l’espressione interna legata a non viene mai valutata (essendo il corpo delletprincipale semplicemente la costante3). - Con valutazione Eager: Tenta di valutare subito l’argomento del
letesterno, entrando in un loop infinito. - Confronto tra
let x = (let y = M in N) in Lelet y = M in (let x = N in L). Sono logicamente equivalenti? Non sempre in modo generale. si trova nello scope di nella seconda forma, mentre nella prima è confinato all’interno di e non è visibile in (a meno che non contenga a sua volta legami o conflitti). Se utilizza la variabile , la prima forma fallisce o fa riferimento a un esterno (libero), mentre la seconda lega correttamente tramite illetpiù esterno. Dunque, i due termini non sono equivalenti a meno che non contenga variabili libere dipendenti da quel legame.