CDuced
3/21/2006 01:43:00 PM
J'ai fait quelques essais avec CDuce, un langage développé dans la thèse d'Alain Frisch...
Le langage est typé statiquement et supporte ce qu'ils appellent le sous-typage sémantique, encore mieux que le sous-typage structurel dont Caml fait usage avec les objets et les variants polymorphes. On voit vraiment un type comme décrivant un ensemble de valeurs, ainsi 1 devient un type (habité par 1), (1|2) est le type habité par 1 et 2, et [('b'|'a')+] est le langage régulier que vous devinez. La disjonction permet aussi d'avoir des fonctions surchargées contrairement à Caml, comme montré plus bas. Par contre j'ai pas vu le polymorphisme, ni un joli système de labels et d'arguments optionnels comme Caml.
Côté valeurs on a des enregistrements assez souples (en gros on a l'OO) et surtout une structure de donnée XML, par exemple <p>[<a href="url">["titre"]] mais aussi <foo>[(fun (Int -> Int) x -> x+1)]. Tous ces types de valeurs sont manipulés avec simplicité grâce au filtrage, qui permet en particulier de pratiquer l'analyse par regexp sur les String. Et pour ceux qui ne savent pas, le typage là dedans sert à vous assurer que vous sortez une valeur bien formée, et que vous traitez complètement les valeurs que vous prétendez traiter. Vu l'expressivité du système, c'est un beau cadeau.
Les principaux inconvénients jusque là c'est la syntaxe un peu rigide et la nécessité d'indiquer le type des fonctions, même simples. Avec un peu de persévérance on définit des types de documents XML (ou autre), on charge un document et vérifie qu'il est bien formé, et on le traite en quelques lignes, pour produire à coup sûr un document valide en sortie. Un truc comme le moteur de Blogspot s'écrirait joliment là dedans.
En tout cas ya des idées qu'on voudrait voir se répandre vite.
Le langage est typé statiquement et supporte ce qu'ils appellent le sous-typage sémantique, encore mieux que le sous-typage structurel dont Caml fait usage avec les objets et les variants polymorphes. On voit vraiment un type comme décrivant un ensemble de valeurs, ainsi 1 devient un type (habité par 1), (1|2) est le type habité par 1 et 2, et [('b'|'a')+] est le langage régulier que vous devinez. La disjonction permet aussi d'avoir des fonctions surchargées contrairement à Caml, comme montré plus bas. Par contre j'ai pas vu le polymorphisme, ni un joli système de labels et d'arguments optionnels comme Caml.
Côté valeurs on a des enregistrements assez souples (en gros on a l'OO) et surtout une structure de donnée XML, par exemple <p>[<a href="url">["titre"]] mais aussi <foo>[(fun (Int -> Int) x -> x+1)]. Tous ces types de valeurs sont manipulés avec simplicité grâce au filtrage, qui permet en particulier de pratiquer l'analyse par regexp sur les String. Et pour ceux qui ne savent pas, le typage là dedans sert à vous assurer que vous sortez une valeur bien formée, et que vous traitez complètement les valeurs que vous prétendez traiter. Vu l'expressivité du système, c'est un beau cadeau.
# let f = fun (Int -> Bool ; <bla>[Any] -> 1)
| <bla>[ _ ] -> 1
| 1 -> `true
| _ -> `false ;;
val f : <bla>[ Any ] -> 1 & Int -> Bool = <fun>
# f 1 ;;
- : Bool = `true
# f 2 ;;
- : Bool = `false
# f <bla>[1] ;;
- : 1 = 1
Les principaux inconvénients jusque là c'est la syntaxe un peu rigide et la nécessité d'indiquer le type des fonctions, même simples. Avec un peu de persévérance on définit des types de documents XML (ou autre), on charge un document et vérifie qu'il est bien formé, et on le traite en quelques lignes, pour produire à coup sûr un document valide en sortie. Un truc comme le moteur de Blogspot s'écrirait joliment là dedans.
En tout cas ya des idées qu'on voudrait voir se répandre vite.
1 commentaires:
Pour éviter d'écrire les types de toutes les fonctions, il y a OCamlDuce !
Par Anonyme, Ã 25/4/06 22:19
Un commentaire ?
< Accueil