Linguaggi di Programmazione (6 Marzo 2012)
Esercizio 1
(a)
Monadi in Haskell. Definizione e loro utilizzo.
(b)
Discutere brevemente della Tail Recursion.
Il seguente codice Haskell implementa l'insertion-sort parametrizzato
sul un predicato di precedenza, prec.
insert el [] prec = [el]
insert el (x:xs) prec = if (prec el x)
then (el:(x:xs))
else (x:(insert el xs prec))
insertionsort [] prec = []
insertionsort (x:xs) prec = (insert x (insertionsort xs prec) prec)
Fornire una versione tail-recursive dell'insertion-sort.
(se servissero, si puo' supporre di avere a disposizione le versioni
tail-recursive dell'append e del reverse: appendIt e reverseIt).
Esercizio 2
(a)
Cosa si intende per complex value in PICT?
Cosa descrive la segente regola?
[[(val p = v e)]] = (def c p = [[e]] [[v → c]]) (Cps-Val)
(b)
Cosa si intende per "dynamic dispatch" nel contesto dei linguaggi O.O.?
Featherweight Java utilizza il dynamic dispatch? Giustificare.
Esercizio 3
(a)
Descrivere l'uso dell'algoritmo di unificazione nella valutazione
di programmi PROLOG.
(b)
Descrivere (possibilmente anche con un breve esempio) quella che viene comunemente indicata
come Declarative Concurrency.