Sei sulla pagina 1di 1

Esercizio 1

Considerate il seguente pezzo di pseudo-codice di un linguaggio imperativo (quindi non corrisponde


ad un preciso linguaggio di programmazione). Il numero indica la linea del codice, le parentesi graffe
indicano i blocchi ed il ‘*’ indica la moltiplicazione. Infine la valutazione di espressioni complesse
viene fatta da sinistra a destra e la valutazione delle sottoespressioni può influenzare le espressioni
che le seguono, sempre da sinistra a destra.

01 {int x = 1; 11 int k () {
02 int y = 0; 12 return 2 * w};
03 int z = 0; 13 x = k();
04 int f () { 14 return x};
05 int m () { 15 int h () {
06 return z + x}; 16 int x = 2;
07 z = m(); 17 x = f() + z;
08 return z}; 18 return x};
09 int g () { 19 {int z = 1;
10 int w = 2; 20 x = g() + h();}

Del codice appena visto evidenziate:

• l’annidamento dei blocchi (di ogni blocco indicate dove inizia e dove finisce ed eventualmente
anche il suo nome)

• quali sono i nomi locali di g e quali sono i nomi non locali ?

• che nomi contiene l’ambiente globale?

• che nomi contiene l’ambiente non locale di f?

• alla fine dell’esecuzione del codice, cosa contiene x se lo scope è statico?

• alla fine dell’esecuzione del codice, cosa contiene x se lo scope è dinamico?

Esercizio 2
Considerate la SECD vista a lezione. Eseguite le seguenti SECD (dove eseguire significa che do-
vete descrivere puntualmente tutti i passi della computazione della macchina astratta, e ⊥ indica
l’ambiente vuoto, che voi potete considerare o come una funzione indefinita o come una lista vuota):

1. ([ ], ⊥, times(apply(fun(f, x, x), 5), apply(fun(g, y, times(y, y)), 5)) :: [ ]) :: [ ]

2. ([ ], ⊥, sum(apply(fun(g, y, sum(y, 1)), 4), apply(fun(f, x, x), 2)) :: [ ]) :: [ ]

3. ([ ], ⊥, sum(apply(fun(f, x, times(x, 5)), 2), apply(fun(g, x, x), 5)) :: [ ]) :: [ ]

Potrebbero piacerti anche