#let compteur = ref (0);; compteur : int ref = ref 0
#!compteur;; - : int = 0
#compteur:=2;; - : unit = () #!compteur;; - : int = 2
#let incrémente c = c := !c+1;; incrémente : int ref -> unit = <fun> #incrémente compteur; !compteur;; - : int = 3Attention, l'affectation d'une référence est différente de la redéfinition par un let d'une variable Caml :
|
|
![]()
Figure 0.1 : Les principales notions sur les vecteurs
#[|1; 2; 3|];; - : int vect = [|1; 2; 3|] #make_vect 4 2;; - : int vect = [|2; 2; 2; 2|] #let r = make_vect 3 "Bonjour";; r : string vect = [|"Bonjour"; "Bonjour"; "Bonjour"|]
#r;; - : string vect = [|"Bonjour"; "Bonjour"; "Bonjour"|] #r.(0);; - : string = "Bonjour"
#r.(1) <- "tout"; r.(2) <- "le monde!";; - : unit = () #r;; - : string vect = [|"Bonjour"; "tout"; "le monde!"|]
#[|[|1; 2; 3|]; [|4; 5; 6|]; [|7; 8; 9|]|];; - : int vect vect = [|[|1; 2; 3|]; [|4; 5; 6|]; [|7; 8; 9|]|] #make_matrix 2 1 "Bonjour";; - : string vect vect = [|[|"Bonjour"|]; [|"Bonjour"|]|] #let M = make_matrix 2 3 0;; M : int vect vect = [|[|0; 0; 0|]; [|0; 0; 0|]|] #(* nombre de lignes *) vect_length M;; - : int = 2 #(* nombre de colonnes *) vect_length M.(0);; - : int = 3
#M;; - : int vect vect = [|[|0; 0; 0|]; [|0; 0; 0|]|] #M.(0).(2);; - : int = 0
#M.(1).(0) <- 2; M.(1).(2) <- 5;; - : unit = () #M;; - : int vect vect = [|[|0; 0; 0|]; [|2; 0; 5|]|]
#print_string "Bonjour "; print_string "tout le monde !";; Bonjour tout le monde !- : unit = () #print_string;; - : string -> unit = <fun> #1+2;3;; Entrée interactive: >1+2;3;; >^^^ Attention: cette expression est de type int, mais est utilisée avec le type unit. - : int = 3
#for i = 0 to 9 do print_int i done;;
0123456789- : unit = ()
#let i = ref 0 in
while !i <= 9 do
print_int !i; incr i
done;;
0123456789- : unit = ()
#for i = 9 downto 0 do print_int i done;;
9876543210- : unit = ()
#for i = 0 to (vect_length r)-1 do
print_string r.(i); print_string " "
done;;
Bonjour tout le monde! - : unit = ()
#for i = 0 to (vect_length M)-1 do for j = 0 to (vect_length M.(0))-1 do print_int M.(i).(j); print_string " " done; print_newline () done;; 0 0 0 2 0 5 - : unit = ()
exception Division_by_zero exception Out_of_memory exception Invalid_argument of string exception Failure of string exception Not_found
value failwith : string -> 'a value invalid_arg : string -> 'a
#(* Par des opérations prédéfinies *) 1/0;; Exception non rattrapée: Division_by_zero #hd [];; Exception non rattrapée: Failure "hd" #[|1;2;3|].(10);; Exception non rattrapée: Invalid_argument "vect_item" #(* Par des fonctions que l'on définit *) let rec member nom liste = match liste with | [] -> raise Not_found | e::l -> e=nom || member nom l;; member : 'a -> 'a list -> bool = <fun> #member 1 [1;2;3];; - : bool = true #member 4 [1;2;3];; Exception non rattrapée: Not_found #let chiffre1 n = if n < 10 then n else raise (Invalid_argument (string_of_int n));; chiffre1 : int -> int = <fun> #chiffre1 12;; Exception non rattrapée: Invalid_argument "12" #let chiffre2 n = if n < 10 then n else invalid_arg (string_of_int n);; chiffre2 : int -> int = <fun> #chiffre2 12;; Exception non rattrapée: Invalid_argument "12" #let chiffre3 n = if n < 10 then n else failwith "chiffre3: argument > 10";; chiffre3 : int -> int = <fun> #chiffre3 12;; Exception non rattrapée: Failure "chiffre3: argument > 10" #let chiffre4 n = if n < 10 then n else raise (Failure "chiffre4: argument > 10");; chiffre4 : int -> int = <fun> #chiffre4 12;; Exception non rattrapée: Failure "chiffre4: argument > 10"
#(* Sans argument *) exception Stop;; L'exception Stop est définie. #Stop;; - : exn = Stop #(* Avec argument *) exception Trouvé of int;; L'exception Trouvé est définie. #Trouvé;; - : int -> exn = <fun> #Match_failure;; - : string * int * int -> exn = <fun>
... raise exception ...
#let search e v =
for i = 0 to vect_length v - 1 do
if v.(i)=e then raise (Trouvé i)
done;;
search : 'a -> 'a vect -> unit = <fun>
#let search e v =
let i = ref 0 in
while true do
if v.(!i)=e then raise (Trouvé !i);
i := !i+1
done;;
search : 'a -> 'a vect -> unit = <fun>
#search "B" [|"A";"B";"C";"D"|];;
Exception non rattrapée: Trouvé 1
#search "E" [|"A";"B";"C";"D"|];;
Exception non rattrapée: Invalid_argument
"vect_item"
#let failwith s = raise (Failure s);;
failwith : string -> 'a = <fun>
Une levée d'exception est un effet de bord.
try expression with | exception_1 -> expression_1 | exception_2 -> expression_2 | : | exception_n -> expression_nOn appelle l'expression try ... with le traite-exception de l'exception exception_j.
#(* Sous-vecteur d'un vecteur v commençant
à la première occurrence de l'élément e
dans v *)
let sous_vecteur e v =
try search e v;[|"impossible"|] with
| Trouvé i ->
sub_vect v i (vect_length v - i)
| Invalid_argument "vect_item" -> [||];;
sous_vecteur : string -> string vect ->
string vect = <fun>
#sous_vecteur "B" [|"A";"B";"C";"D"|];;
- : string vect = [|"B"; "C"; "D"|]
#sous_vecteur "E" [|"A";"B";"C";"D"|];;
- : string vect = [||]
#let sans_doublons v =
try
for i = 0 to vect_length v - 1 do
if v.(i)=v.(i+1) then raise Stop
done; true
with Stop -> false;;
sans_doublons : 'a vect -> bool = <fun>
#exception absent of int;;
L'exception absent est définie.
#let rec trouve_nom numero amphi =
match amphi with
| [] -> raise (absent numero)
| (x,n)::reste ->
if n=numero then x
else trouve_nom numero reste;;
trouve_nom : int -> ('a * int) list -> 'a
= <fun>
#let verif = function (numero, amphi) ->
try (trouve_nom numero amphi) with
| absent p -> "chercher_à_la_scolarité";;
verif : int * (string * int) list ->
string = <fun>
#exception erreur of int;;
L'exception erreur est définie.
#exception signal of string;;
L'exception signal est définie.
#let f_qui_déclenche = function x ->
if x < 0 then raise (erreur (-x)) else
if x=0
then raise (signal "reprise au vol")
else x;;
f_qui_déclenche : int -> int = <fun>
#f_qui_déclenche (-4);;
Exception non rattrapée: erreur 4
#f_qui_déclenche 2;;
- : int = 2
#let récupère = function x ->
try f_qui_déclenche x with
| erreur 0 -> 0
| erreur y -> 25-y+3*x
| signal _ -> 100*x+1;;
récupère : int -> int = <fun>
#(récupère 2),(récupère (-4)),(récupère 0);;
- : int * int * int = 2, 9, 1
#let sans_doublons v =
let i = ref 0
and t = ref false in
while !i < vect_length v && not !t do
if v.(!i)=v.(!i+1) then t := true;
i := !i+1
done; !t;;
sans_doublons : 'a vect -> bool = <fun>
#let rec member_rec e l = match l with
| [] -> raise Not_found
| e'::l' ->
if e=e' then raise Stop
else member_rec e l';;
member_rec : 'a -> 'a list -> 'b = <fun>
#let member e l =
try member_rec e l with
| Not_found -> false
| Stop -> true;;
member : 'a -> 'a list -> bool = <fun>
#member 2 [1;2;3];;
- : bool = true
#member 4 [1;2;3];;
- : bool = false
#let rec member x l =
try x = hd l or member x (tl l)
with Failure "hd" -> false;;
member : 'a -> 'a list -> bool = <fun>
#member 2 [1;2;3];;
- : bool = true
#member 4 [1;2;3];;
- : bool = false