Caml Dim

Bruno Blanchet (blanchet@clipper.ens.fr)
Thu, 7 Dec 1995 17:47:16 +0100 (MET)

From: blanchet@clipper.ens.fr (Bruno Blanchet)
Message-Id: <199512071647.RAA04571@clipper.ens.fr>
Subject: Caml Dim
To: caml-list@pauillac.inria.fr
Date: Thu, 7 Dec 1995 17:47:16 +0100 (MET)

Caml Dim, extension de Caml Light 0.7 qui gere les types avec dimensions,
est disponible par ftp anonyme :

host : ftp.ens.fr
directory : /pub/unix/lang/caml/camldim

Voici une description succinte de ce programme. Vous trouverez plus de
details dans mon rapport inclus dans les archives sur ftp.

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@ens.fr

Bruno Blanchet.