Programmation Avancée
TP10: CDuce
Dans ce TP nous allons utiliser CDuce. La version précise n'a pas
d'importance.
Pour utiliser cduce, le plus rapide est de
jouer en ligne avec le langage.
Pour une utilisation plus confortable, vous pouvez installer
l'interprète via opam install cduce
.
Dans tous les cas, il est recommandé d'avoir la documentation en
ligne sous la main, notamment cet
aide-mémoire.
Exercice 1: comparaisons de types
Pour chacune des paires de types suivantes, comparer les types: sont-ils égaux, inclus, disjoints? Dans tous les cas, justifier votre réponse par du code.
-
1
etInt
-
Bool
etInt
-
(Bool,3)
et(`false,Int)
-
(Int,String)
et[ Int+ ]
-
[ Int Bool* Int ]
et[ Int+ ]
-
Int
et[ Int ]
-
Int -> Int
etBool -> Bool
Exercice 2: conversion sexiste
On considère les définitions suivantes, où l'on décrit des personnes avec un attribut décrivant leur genre:
type Person = FPerson | MPerson type FPerson = <person gender = "F">[ Name Children ] type MPerson = <person gender = "M">[ Name Children ] type Children = <children>[ Person* ] type Name = <name>[ PCDATA ]
Dans la variante suivante le genre est directement exprimé par le nom de l'élément utilisé, et les enfants sont rangés par ordre de galanterie:
type Man = <man name=String>[ Daughters Sons ] type Woman = <woman name=String>[ Daughters Sons ] type Sons = <sons>[ Man* ] type Daughters = <daughters>[ Woman* ]
Question
Ecrire une fonction qui convertisse du premier au second style, avec un type aussi précis que possible. On utilisera la capture de (sous-)séquences par pattern-matching.
On pourra tester sur l'exemple suivant:
let test : Person = <person gender="M">[ <name>"Pierre" <children>[ <person gender="M">[ <name>"Jacques" <children>[] ] <person gender="F">[ <name>"Paule" <children>[ <person gender="M">[ <name>"Jacob" <children>[] ] ] ] ] ] let [] = dump_xml (conv test)
Exercice 3: c'est foo
On considère le code suivant, où S
et T
sont pour l'instant inconnus:
let foo (S -> T) | (l1 & [Any*], l2) -> (foo l1) @ (foo l2) | (e, l2) -> (e, foo l2) | [] -> []
Question 1
Que fait cette fonction?
Question 2
Instantier les types S
et T
de façon correcte et aussi précise
que possible.
Question 3
On considère maintenant le type x = [] | [ 'a' x 'b' ]
,
que peut-on dire de l'ensemble des résultats de foo
sur les
valeurs de x
?
ceci peut-il s'exprimer comme un type?
Exercice 4: les membres du LSV
Le fichier lsv.html contient une version (très rapidement)
nettoyée de la page des membres du LSV.
La fonction load_xml
permet de la charger en tant que valeur CDuce.
Comme il ne s'agit pas de HTML valide on n'essaiera pas de la typer
mieux que AnyXml
.
Question 1
Ecrire une fonction persons
qui analyse la page et extrait les balises
td
ayant pour attribut itemtype="http://schema.org/Person"
, avec leur
contenu.
Question 3
Calculer la liste des enseignants-chercheurs parmi les membres du labo,
i.e. ceux pour lequel le jobTitle
contient professor
, éventuellement
avec un p
majuscule.
Question 4
Chaque description de personne contient l'URL d'une photo. L'utiliser pour
produire un trombinoscope des enseignants-chercheurs du labo. Pour faire
cela dans les règles de l'art,
récupérer le fichier xhtml1-strict.cd qui contient
les définitions de type correspondant à la DTD du XHTML 1.1 strict,
et produire votre page sous la forme d'une valeur de type html
qui sera
ensuite sérialisés par dump_xml
en un fichier XML valide par construction.