A.A. 2000-01

Linguaggi di Programmazione I: Paradigmi Prova scritta del 7 febbraio 2001

Esercizio 1. Considerate 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 venga specificata con proc P (x) is p_{1} in p_{2}. 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. Fornire l’esempio di un programma che restituisca 1 se valutato adottando il meccanismo di passaggio dei parametri “by value”, 2 se valutato “by reference” e 3 se valutato “by name”.

Esercizio 2. Adottando la sintassi di ML (usando i costrutti let e fn) o di Smalltalk (usando i blocchi), definire un programma che produca risultati diversi se valutato con regole di scope statico o dinamico.

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

let x = (fn y ⇒ (fn z ⇒ z)) in ((x 5) (x true))

nel sistema formale dei tipi di ML.

Esercizio 4. Discutere brevemente (100 parole circa) la nozione di ereditarietà nei linguaggi di programmazione ad oggetti.

Esercizio 5. Sia SIG la seguente segnatura ML:

signature SIG
   sig
      type t
      val elem : t
   end;

Definire un funtore MkListOf (structure S : SIG) : SIG che, data una sruttura S1, ne restituisca una S2 tale che S2.elem sia la lista che abbia S1.elem come unico elemento.

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

class A {
    public void m () {
        System.out.println("A");
    }
}
class B extends A {
    public void m () {
        System.out.println("B");
    }
    public void xxx () {
        super.m();
        this.m();
    }
}
class C extends B {
    public void m () {
        System.out.println("C");
    }
}
public class superesempio {
    public static void main (String [] args) {
        B pippo = new C();
        pippo.xxx();
    }
}

Giustificare la risposta.