Caml Dim

Bruno Blanchet (Bruno.Blanchet@inria.fr)

Caml Dim, extension de Caml Light 0.74 qui gère les types avec dimensions, est disponible ici.

Voici une description succinte de ce programme. Vous trouverez plus de details dans mon rapport inclus dans l'archive de Caml Dim.

Caml Dim est une extension du compilateur Caml Light, pour lui permettre de contrôler les dimensions des donnees manipulees. Les verifications de type effectuees par le compilateur sont donc renforcees, et les erreurs peuvent etre signalees à l'utilisateur.

Les seuls constructeurs predefinis qui prennent des arguments dimensionnels sont int et float.

L'utilisateur peut definir ses propres types dimensionnes a partir de ceux-ci. Par exemple :

   type ['d] complex = {re : ['d] float; im: ['d] float};;
   type 'a ['d] abbrev == 'a * ['d] complex;;
(les dimensions sont indiquees entre crochets. Voir les details de la syntaxe dans mon rapport).

Tous les identificateurs de dimension doivent etre declares par l'instruction

   dimension nom(unite);;
Exemple : dimension length(m);; L'identificateur m est alors une constante de type [length] float et qui a pour valeur numerique 1.

Pour profiter des dimensions, il faut ouvrir les modules dfloat (flottants avec dimensions), dint (entiers avec dimensions) et dimens (declarations d'unites physiques courantes). Ces modules ne sont pas ouverts au depart pour compatibilite avec Caml Light.

Exemple de programme simple :

#open "dfloat";;
#open "dimens";;

let R = 1e3 * ohm;;
let C = 1e-10 * farad;;
type ['d] complex = {re : ['d] float; im : ['d] float};;

let (prefix *) = fun a b -> 
   {re = a.re *. b.re -. a.im *. b.im;
    im = a.re *. b.im +. b.re *. a.im};;

let (prefix /) = fun a b -> 
   let carremod = sqr(b.re)+. sqr(b.im) 
   in {re = (a.re *. b.re +. a.im *. b.im) /. carremod;
       im = (a.im *. b.re -. a.re *. b.im) /. carremod};;
   
let calcu w ( i : [intensity] complex ) =
   i / {re = 2. /. R; im = C *. w};;
Tous commentaires peuvent etre envoyes a Bruno.Blanchet@inria.fr.

Bruno Blanchet.