Le langage OCaml

 

1) Introduction

Extrait de wikipedia - OCaml, est la suite du langage Caml créé en 1996. C'est un meta-langage, projet open source de l'Inria, un langage fonctionnel auquel on a ajouté la programmation impérative, orientée objet et modulaire. Le systeme de types hérité, statique, fort et inféré, permet une manipulation aisée de structures de données complexes : on peut aisément représenter des types algébriques, c'est-a-dire des types hiérarchisés et potentiellement récursifs (listes, arbres), et les manipuler aisément a l'aide du filtrage par motif. Cela fait de OCaml un langage de choix dans les domaines demandant la manipulation de structures de données complexes, par exemple les compilateurs. Le typage fort, ainsi que l'absence de manipulation explicite de la mémoire (présence d'un ramasse-miettes) font de OCaml un langage trés sur. Il est aussi réputé pour ses performances, grâce a la présence d'un compilateur de code natif.

"Apprendre à programmer avec OCaml", Sylvain Conchon, Jean-Christophe Filliâtre, éditions Eyrolles, 2014.

2) Compilateur, interpréteur, éditeur

L'installation est disponible à travers les principaux systèmes de paquets (apt-get, port, yum, brew, etc...)

Compilateur générant du code portable ocamlc
Compilateur générant du code natif plus efficace ocamlopt
Interpréteur ocaml
Editeur gedit

Les fichiers en ocaml ont l'extention .ml. Exemples de commandes :

ocamlc hello.ml Compile le fichier hello.ml pour produire un exécutable en code portable a.out.
ocamlopt hello.ml Compile le fichier hello.ml pour produire un exécutable en code natif a.out.
ocaml -o hello hello.ml Compile le fichier hello.ml pour produire un exécutable hello.
./hello Execute le programme hello
Editeur gedit

L'interpréteur se lance en tapant dans un terminal la commande ocaml. Chaque instruction passée à l'interpréteur doit se terminer par ;;. Pour quitter tapez la commande #quit suivie de ;; ou bien faite simplement un <Ctrl D>.

3) Première lecture

Le programme hello :

Let ( ) = print_string "Hello le monde!\n"

Les nombres eniers peuvent etre écrit en décimal, binaire, octal, hexadécimal, et les chiffres peuvent etre séparés par des _ :

Préfixe
Base
0x
hexadécimal
0o
octal
0b
binaire

Suffixe
Type
l
int32
L
int64
0b
binaire

min_int   Le plus petit int
max_int   Le plus grand int
     
     
true   Valeur booléenne true
false   Valeur booléenne false
&&   Et booléen
||   Ou booléen
not   Non booléen
     
land   Et bit à bit (opère sur deux int)
lor   Ou bit à bit (opère sur deux int)
lxor   Non ou bit à bit (opère sur deux int)
lnot   Non bit à bit (opère sur deux int)
     
int_of_string Sys.argv.(1)   Lit un entier en premier argument de la ligne de commande
     
'\n'   caractère saut de ligne
     
"ga"^"bu"
"gabu"
Concaténation de chaine
"abcd".[1]
'a'
String.length("abcd")
4
print_string("gabu")
print_char('a')    
print_int(3)    
print_float(3.14)    
print_newline()    
print_endline("abcd")    
Printf.printf(...)   printf
     
     
read_int( )   Lit un entier sur l'entré standart
read_float( )   Lit un float sur l'entré standart
read_line( )   Lit une ligne sur l'entré standart
     
     

 

ocamlc -i prog.ml Affiche les types des variables apparaissant dans le prorgramme prog.ml

 

let p = ref 5
p:= !p +1

6
Crée une variable p de type int ref.
!p est de type int et vaut 5. ! est l'opérateur de déférencement.
     
+, *, /   Opération sur les int
+., *., /., **   Opération sur les float
float(4) 4.0 Converti un int en float
truncate(3.14) 3 Retourne l'int juste inférieur ou égale
     
min_float   Valeur minimal positive d'un float
max_float   Valeur maximal positive d'un float
neg_infinity   Moins l'infini
infinity   Plus l'infini
nan   Indéterminé

 

for i = 1 to 10 do
print_int i
done

  Affiche 123456789

Le point-virgule ";" sépare les intsructions sur une meme ligne.

Interface graphique

Pour utiliser la bibliothèque graphique d'OCaml, on ajoute la bibiothèque graphics.cma dans l'ordre de compilation comme suit :

ocamlc graphics.cma prog.ml
ocamlopt graphics.cmxa prog.ml

open Graphics

let () = open_graph " 600x400"

let x = ref 300.
let y = ref 200.
let () =
   moveto (truncate(!x)) (truncate(!y));
   for i = 0 to 200000 do
      let dx = Random.float 1. -. 0.5 in
      let dy = Random.float 1. -. 0.5 in
      x := !x +. dx;
      y := !y +. dy;
      lineto (truncate(!x)) (truncate(!y));
   done;
ignore (read_key());

 

 

---- 28 décembre 2014 ----