A.A. 2000-01

Linguaggi di Programmazione I: Paradigmi Prova scritta del 19 giugno 2001

Esercizio 1. Considerate un linguaggio di programmazione imperativo con scoping statico, e nel quale la dichiarazione (ed inizializzazione) di una variabile venga specificata mediante la costruzione sintattica var x = e in p. In questo linguaggio il passaggio dei parametri avviene “per nome”, e la dichiarazione di una procedura viene specificata con proc P(x) is p1 in p2. Il linguaggio Il linguaggio supporta inoltre l’uso degli array, come nel seguente esempio:

   var x = [7, 4, 5] in x[1] ::= x[2]

che crea un array x di lunghezza 3 ed assegna il valore del terzo elemento, 5, al secondo. Spiegare dettagliatamente l’effetto dell’esecuzione del seguente programma:

var y = 0 in
   var x = [1,2,3,4] in
      proc P(z) is
         (y := y+1; print(x[z]))
      in (var y = 1 in P(x[y+1]))

Esercizio 2. Fornire un albero di derivazione che assegni un tipo al termine

let x = (fn y ⇒ y) in ((x x) x)

nel sistema formale dei tipi di ML.

Esercizio 3. Applicando l’algoritmo W di inferenza dei tipi in ML, assegnare un tipo al termine dell’esercizio precedente.

Esercizio 4. Definire in ML un tipo di dato astratto che rappresenti i numeri naturali, e per il quale siano definite le operazioni zero, one, sum e equals (con ovvio significato).

Esercizio 5. Qual è il valore stampato dal seguente programma Java?

class A {
   int x () {
      return 4;
   }
}
class B extends A {
   int x () {
      return 5;
   }
   int m () {
      return super.x() + this.x();
    }
}
class C extends B {
   int x () {
      return 6;
   }
}
class javaex3 {
   public static void main (String [] args) {
      B ugo = new C();
      System.out.println(ugo.m());
    }
}

Giustificare la risposta.