Cours 1

Htmligure
Version & licenses
Creative Commons License

Un premier exemple

Guyslain
Thursday, 21 July 2016

Retour au sommaire.

Voici un premier exemple d'un fichier source en OCaml.

  1. (* Commentaire : ce fichier s'appelle geometry.ml *)


  2. type vector = float * float


  3. let origin = (0., 0.)

  4. let x_unit = (1., 0.)

  5. let y_unit = (0., 1.)

  6. let vector x y = (x,y)

  7. let translate ~by:(dx,dy) (x,y) = (x +. dx, y +. dy)

  8. let scale alpha (x,y) = (alpha *. x, alpha *. y)

  9. let rotate ~angle (x,y) =
  10. ( cos angle *. x -. sin angle *. y,
  11. sin angle *. x +. cos angle *. y
  12. )

  13. let abscissa = fst

  14. let ordinate = snd


  15. module Circle = struct

  16. type t = vector * float

  17. let unit = (origin, 1.)

  18. let create ~center ~radius = (center, radius)

  19. let translate ~by:vector (center, radius) =
  20. (translate ~by:vector center, radius)

  21. end

Ce fichier définit un type des vecteurs en 2 dimensions, avec quelques opérations associés, et définit ce qu'est un cercle. Sa structure est relativement simple, il s'agit d'une suite de définition de types (vector) introduits par type, de valeurs (origin, x_unit, create, move, etc.) introduites par let et de modules (Circle) introduits par module.

Un module est lui-même une suite de définitions de types, de valeurs et de modules. Les modules permettent de grouper le code en ensemble cohérent. En fait, le fichier lui-même, qui s'appelle ici geometry.ml, définit un module Geometry, contenant toutes les définition du fichier.

Le fichier geometry.ml est accompagné d'un fichier de même nom, mais d'extension mli, donc geometry.mli que voici :

  1. (* geometry.mli *)

  2. (** the type for 2-dimensional vectors. *)
  3. type vector

  4. (** The unit vector, whose coordinates are zero. *)
  5. val unit : vector

  6. (** The x-axis vector. *)
  7. val x_unit : vector

  8. (** The y-axis vector. *)
  9. val y_unit : vector

  10. (** [vector x y] is the vector of coordinates ([x],[y]). *)
  11. val vector : float -> float -> vector


  12. (** [translate ~by:displacement vector] is the vector obtained
  13. by translating [vector] by [displacement].
  14. *)
  15. val translate : by:vector -> vector -> vector


  16. (** [scale factor vector] is the vector obtained by multiplying
  17. each coordinates of [vector] by [factor].
  18. *)
  19. val scale : float -> vector -> vector

  20. (** [rotate ~angle:theta vector] is the voector obtained by
  21. rotation of [vector] by an angle [theta].
  22. *)
  23. val rotate : angle:float -> vector -> vector


  24. (** A module to represent and operate on circles in the plane. *)
  25. module Circle : sig

  26. (** The type of 2-dimensional circles. *)
  27. type t

  28. (** The unit circle, with center at origin, and radius 1. *)
  29. val unit : circle

  30. (** [create ~center ~radius] is a circle with given center and radius. *)
  31. val create : center:vector -> radius:float -> circle

  32. (** [translate ~by:displacement circle] is the circle obtained
  33. by translating the center of [circle] by [displacement]. *)
  34. val translate : by:vector -> circle -> circle

  35. end

Ce fichier décrit ce qui est défini par le module Geometry, sans surprise une liste de types, de valeurs et de modules. Chaque valeur et chaque module est décrit par son type. Les valeurs sont introduites par le mot-clé val, leur identifiant et leur type. Les modules sont décrits par la liste des types, valeurs et modules qu'ils contiennent, de la même façon.

On note que le fichier geometry.mli n'a pas déclaré toutes les valeurs définies dans geometry.ml. Ces valeurs ne sont en fait pas exportées : les valeurs déclarées pourront être utilisées par d'autres modules, celles non-déclarées ne peuvent être utilisées qu'au sein du module Geometry. De même, certains types ou modules auraient pu ne pas être déclarés dans le fichier geometry.mli. De fait, le 'i' de mli tient pour interface : ce fichier décrit comment peut être utilisé le module Geometry. Le fichier d'interface est commenté pour documenter l'utilisation du module associé.

Retour au sommaire.