A.A. 2000-01

Linguaggi di Programmazione I: Paradigmi Prova scritta del 26 settembre 2001

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

class A {
    void nnn () {
        System.out.println("AAA");
    }
}
class B extends A {
    void mmm () {
        this.nnn();
        super.nnn();
    }
    void nnn () {
        System.out.println("BBB");
    }
}
class C extends B {
    void nnn () {
        System.out.println("CCC");
    }
}
class D extends C {
    void nnn () {
        System.out.println("DDD");
    }
}
class thissuper {
    public static void main (String[] args) {
        C x = new D();
        x.mmm();
    }
}

Giustificare la risposta.

Esercizio 2. Si consideri un linguaggio di programmazione imperativo nel quale la dichiarazione (ed inizializzazione) di una variabile venga specificata mediante la costruzione sintattica var x = e in p, e la dichiarazione di una procedura con proc P(x) is p1 in p2. Si assuma inoltre che linguaggio supporti l’uso degli array, come nel seguente esempio: l’istruzione

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

crea un array x di lunghezza 3 ed assegna il valore del terzo elemento, 5, al secondo. Descrivere, motivando le risposte, l’effetto del seguente programma nel caso di scoping statico e dinamico, considerando per ciascuno di essi tre meccanismi di passaggio dei parametri: per valore, per riferimento e per nome (sei casi!).

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

Esercizio 3. Senza usare il tipo primitivo int, definire in ML il tipo di dato astratto dei numeri naturali pari, con associata operazione di somma.