Slide: 1
Le langage Objective Caml
(Prise en main de)
figure=logocaml-petit.ps
Slide: 2
Caractéristiques
-
langage fonctionnel,
- typé statiquement,
- polymorphe paramétrique,
- avec inférence de types,
- muni d'un mécanisme d'exceptions
- et de traits impératifs,
- possèdant un système de modules paramétrés
- (et un modèle objet),
- possiblement indépendant de l'architecture machine.
Slide: 3
Histoire
-
l'ancêtre : ML (meta-langage) de LCF (80)
- machine abstraite : la CAM ; Curien, Cousineau
- spécifications : Standard ML (84 - Milner)
- premières implantations
-
CAML - Suarez - Weis - Mauny (87)
- SML/NJ - Mc Queen - Appel (ATT - 88)
- nouvelles implantations : Caml-light (90) Leroy - Doligez
- modules paramétrés : CSL (95)
- extension objet (96)
Slide: 4
Mises en oeuvre (1/3)
Compilateur de byte-code
$ cat p.ml
let f x = x+1
print_int (f 1999); print_newline()
$ ocamlc -i -o p.exe p.ml
val f : int -> int
$ file p.exe
p.exe: a /usr/local/bin/ocamlrun script text
$ ./p.exe
2000
Slide: 5
Mises en oeuvre (2/3)
Compilateur natif (pour Intel, Sparc, HP-pa, PowerPC, etc.)
$ ocmalopt -o p.exe p.ml
$ file pp.exe
p.exe: ELF 32-bit LSB executable, Intel 80386,
version 1 (FreeBSD), dynamically linked, not stripped
$ ./p.exe
2000
Slide: 6
Mises en oeuvre (3/3)
Boucle d'interaction (byte code à la volée)
$ ocaml
Objective Caml version 3.00
# let f x = x+1 ;;
val f : int -> int = <fun>
# print_int (f 1999); print_newline() ;;
2000
- : unit = ()
# #quit ;;
$
Slide: 7
Plan du 1ier jour
-
Types et opérateurs numériques
- Définir et utiliser des fonctions (sur les nombres)
- Manipuler les nombres
- Autres types de base simples
- Types et structures de données paramétrés
- Manipuler ces types
- Types utilisateurs
- Des expressions (synthèse)
- Des programmes
Slide: 8
Types et opérateurs numériques
Slide: 9
Les nombres
-
Entiers :
-
type int
- valeurs [-230,230-1]
(sur machine 32 bits)
- Flottants :
-
type float
- valeurs mantisse 53 bits, exposant [-1022,1023]
(norme IEEE 754)
Slide: 10
Les nombres - notation (1/3)
On utilise la boucle d'interaction ocaml
Entiers, décimale
# 1 ;;
- : int = 1
-
le
#
est l'invite ;
-
1
est l'expression ;
- le
;;
provoque l'évaluation ;
- on obtient en retour
le type (
int
) et la valeur (1
)
Slide: 11
Les nombres - notation (2/3)
Entiers, négatifs, hexadécimale, octale, binaire
# -1 ;;
- : int = -1
# 0xffffffff ;;
- : int = -1
# 0o10 ;;
- : int = 8
# 0b10 ;;
- : int = 2
Slide: 12
Les nombres - notation (3/3)
Flottants, décimale pointée, exponentielle
# 1.0 ;;
- : float = 1.000000
# 1. ;;
- : float = 1.000000
# 0.1 ;;
- : float = 0.100000
# 1.e-1 ;;
- : float = 0.100000
Slide: 13
Opérations sur les nombres (quelques)
Entiers |
Flottants |
+ |
addition |
- |
soustraction |
* |
multiplication |
/ |
division entière |
mod |
modulo |
|
+. |
addition |
-. |
soustraction |
*. |
multiplication |
/. |
division |
** |
exponentiation |
|
Opérateurs infixes à précédance
# 1 + 2 * 3 mod 4;;
- : int = 3
Slide: 14
Définition et utilisation de fonctions
Slide: 15
Définir une fonction
Déclaration, type inféré
# let cube x = x*x*x ;;
val cube : int -> int = <fun>
Notez: pas de return
Application, préfixe
# cube 3 ;;
- : int = 27
Slide: 16
Appliquer une fonction
Attention à la priorité
# cube 3+1 ;;
- : int = 28
# cube (3+1) ;;
- : int = 64
# cube cube 3 ;;
This function is applied to too many arguments
# cube (cube 3) ;;
- : int = 19683
L'application associe à gauche
Slide: 17
Définir une fonction récursive
Construction alternative
if test then expr1 else expr2
Déclaration récursive explicite
# let fact n = if n <= 0 then 1 else n * (fact (n-1)) ;;
Unbound value fact
# let rec fact n = if n = 0 then 1 else n * (fact (n-1)) ;;
val fact : int -> int = <fun>
Slide: 18
Définir une fonction récursive partielle
Erreurs et exceptions
# let rec fact n =
if n < 0 then failwith "undefined"
else if n = 0 then 1
else n * (fact (n-1))
;;
# fact (-1)
Uncaught exception: Failure "undefined".
Remarquez les parenthèses autour de -1
Slide: 19
Définir des fonctions mutuellements récursives
Construction let rec ... and ...
# let rec even n =
if n=0 then true
else odd (n-1)
and odd n =
if n=1 then true
else even (n-1)
;;
val even : int -> bool = <fun>
val odd : int -> bool = <fun>
Slide: 20
Définir: divers
Fonction sans argument ou constante
# let x = 3 ;;
val x : int = 3
Définition locale, construction let ... in
# let puiss4 n =
let n2 = n*n in n2*n2 ;;
val puiss4 : int -> int = <fun>
# puiss4 2 ;;
- : int = 16
Slide: 21
Manipuler les nombres
Slide: 22
Calculs sur les nombres (1/3)
Calculs entiers modulo
# max_int ;;
- : int = 1073741823
# min_int ;;
- : int = -1073741824
# max_int+1;;
- : int = -1073741824
Erreur (exception) ou valeurs spéciales
# 1 / 0 ;;
Uncaught exception: Division_by_zero.
# 1.0 /. 0.0 ;;
- : float = Inf
Slide: 23
Calculs sur les nombres (2/3)
Opérateurs fortement typés :
# 1.0 / 0 ;;
This expression has type float but is here used with type int
# 1.0 /. 0 ;;
This expression has type int but is here used with type float
Conversion explicite (lire le type) :
# float_of_int ;;
- : int -> float = <fun>
# (float_of_int 1) /. 2.0 ;;
- : float = 0.500000
Slide: 24
Calculs sur les nombres (3/3)
Attention aux débordements (non spécifié) :
# (float_of_int max_int) ** 2. ;;
- : float = 1152921502459363328.000000
# int_of_float ;;
- : float -> int = <fun>
# int_of_float ((float_of_int max_int) ** 2.) ;;
- : int = 0
Slide: 25
Affichages*
# print_int ;;
- : int -> unit = <fun>
# print_float ;;
- : float -> unit = <fun>
# print_newline ;;
- : unit -> unit = <fun>
# print_int 1; print_newline();
print_float 1.0; print_newline() ;;
1
1
- : unit = ()
-----
* Erratum: print_newline()
Slide: 26
Affichages (commentaires)*
unit
en Objective Caml » void
en C
# () ;;
- : unit = ()
Le type unit contient la seule valeur ()
Opérateur de mise en séquence (d'évaluations) ;
(le point virgule)
# print_int (2+3); 2+3 ;;
5- : int = 5
La séquence est une expression dont la valeur est la dernière
-----
* Erratum: no Warning ...
Slide: 27
Autres types et opérateurs de bases
Slide: 28
Caractères (1/2)
Type char
Notations
# 'A' ;;
- : char = 'A'
# '\n' ;;
- : char = '\n'
# '\010' ;;
- : char = '\n'
Slide: 29
Caractères (2/2)
Code ASCII, ISO 8859-1 standard.
# int_of_char 'A' ;;
- : int = 10
# char_of_int 65 ;;
- : char = 'A'
# char_of_int 0 ;;
- : char = '\000'
# char_of_int (-1) ;;
Uncaught exception: Invalid_argument "char_of_int".
# char_of_int 256 ;;
Uncaught exception: Invalid_argument "char_of_int".
Slide: 30
Chaînes de caractères (1/3)
Type string
Notation
# "Hello" ;;
- : string = "Hello"
# "" ;;
- : string = ""
Concaténation (opérateur infixe) :
# "Hello" ^ " (O'Caml) " ^ "world\n" ;;
- : string = "Hello (O'Caml) world\n"
Slide: 31
Chaînes de caractères (2/3)
Opérateur typé, fonction de conversion :
# 'H' ^ "ello" ;;
This expression has type char but is here used with type string
# "2000" + 1 ;;
This expression has type string but is here used with type int
# int_of_string ;;
- : string -> int = <fun>
# (int_of_string "2000") + 1 ;;
- : int = 2001
# int_of_string "2 000" ;;
Uncaught exception: Failure "int_of_string".
# string_of_char ;;
Unbound value string_of_char
Slide: 32
Chaînes de caractères (3/3)
Bibliothèque (module) String
Création
# String.make 12 '.' ;;
- : string = "............"
# String.create 12 ;;
- : string = "\216\141\013\008H\253\t\008\008Z\006\008"
Taille maximale (module Sys)
# Sys.max_string_length ;;
- : int = 16777211
# String.create (Sys.max_string_length + 1) ;;
Uncaught exception: Invalid_argument "String.create".
Slide: 33
Affichages
Standard
# print_char ;;
- : char -> unit = <fun>
# print_string ;;
- : string -> unit = <fun>
Bibliothèque Printf
# Printf.printf "%d %f %c %s \n" 1 1. '1' "1" ;;
1 1.000000 1 1
- : unit = ()
Slide: 34
Les booléens
Type bool
Deux constantes :
# true ;;
- : bool = true
# false ;;
- : bool = false
Opérateurs
not |
négation |
&& |
conjonction |
|| |
disjonctions |
|
|
Les opérateurs binaires sont infixes et séquentiels
Slide: 35
Connecteurs vs opérateurs logiques
Booléens |
Entiers |
not |
négation |
&& |
conjonction |
|| |
disjonctions |
|
lnot |
négation logique |
land |
conjonction logique (bit à bit) |
lor |
disjonction logique (bit à bit) |
|
# lnot false ;;
This expression has type bool but is here used with type int
# lnot 0 ;;
- : int = -1
# lnot 0xffffffff;;
- : int = 0
Slide: 36
Relations
= |
égalité structurelle |
== |
égalité physique |
< |
inférieur |
> |
supérieur |
|
<> |
négation de = |
!= |
négation de == |
>= |
supérieur ou égal |
<= |
inférieur ou égal |
|
Les relations sont des opèrateurs polymorphes mais homogènes
# 0 < 1 ;;
- : bool = true
# false < true ;;
- : bool = true
# 0 < true ;;
This expression has type int but is here used with type bool
Slide: 37
Types paramétrés
Slide: 38
Produits cartésiens (1/3)
Structures de données polymorphes
Constructeur de type : *
(l'étoile)
Constructeur de valeur : ,
(la virgule)
infixe, polymorphe, hétérogène
# 1, "mai" ;;
- : int * string
# "may", 1 ;;
- : string * int = "may", 1
Slide: 39
Produits cartésiens (2/3)
Accesseurs : fst
et snd
(polymorphes)
# fst ;;
- : 'a * 'b -> 'a = <fun>
# snd ;;
- : 'a * 'b -> 'b = <fun>
Notez l'écriture des variables de type
Remarques :
'a * 'b -> 'a º ('a * 'b) -> 'a
'a * 'b -> 'a ¬ º 'a * ('b -> 'a)
Slide: 40
Produits cartésiens (3/3)
Attention à la syntaxe
# fst (1,"mai") ;;
- : int = 1
# fst 1, "mai" ;;
This expression has type int but is here used with type 'a * 'b
Objective Caml est un langage fonctionnel
# int_of_char, char_of_int ;;
- : (char -> int) * (int -> char) = <fun>, <fun>
# (fst (int_of_char, char_of_int)) 'A' ;;
- : int = 65
Slide: 41
Apparté: qu'est-ce qu'une fonction binaire ? (1/2)
# let pol1 (n, m) = 3*n*n + 2*m + 1 ;;
val pol1 : int * int -> int = <fun>
# pol1 (1, 2) ;;
- : int = 8
# pol1 1 2 ;;
This function is applied to too many arguments
Un couple est une valeur
# let pol1' c = 3*(fst c)*(fst c) + 2*(snd c) + 1 ;;
val pol1' : int * int -> int = <fun>
Slide: 42
Apparté: qu'est-ce qu'une fonction binaire ? (2/2)
Ça n'existe pas !
# let pol2 n m = 3*n*n + 2*m + 1 ;;
val pol2 : int -> int -> int = <fun>
# pol2 1 ;;
- : int -> int = <fun>
# pol2 1 2 ;;
- : int = 8
Car
-
int -> int -> int º int -> (int -> int)
- pol2 1 2 º ((pol2 1) 2)
Slide: 43
Couples vs n-uplets
# 1, "mai", 2001 ;;
- : int * string * int = 1, "mai", 2001
# (1, "mai"), 2001 ;;
- : (int * string) * int = (1, "mai"), 2001
# (1, "mai", 2001) = ((1, "mai"), 2001) ;;
This expression has type int * string * int but is here used
with type (int * string) * int
# (1, "mai", 2001) = (1, ("mai", 2001)) ;;
This expression has type int * string * int but is here used
with type int * (string * int)
Slide: 44
Listes polymorphes homogènes (1/3)
Type 'a list
-
constructeurs
-
liste vide, notée
[]
- ajout d'un élément en tête, noté
::
(infixe)
- accesseurs (module List)
-
élément en tête,
List.hd : 'a list -> 'a
List.hd (x::xs) º x
- suite de la liste,
List.tl : 'a list -> 'a list
List.tl (x::xs) º xs
Slide: 45
Listes polymorphes homogènes (2/3)
Notation, construction
# [];;
- : 'a list = []
# [1; 2; 3] ;;
- : int list = [1; 2; 3]
# 0::[1; 2; 3] ;;
- : int list = [0; 1; 2; 3]
# 0::1::2::3::[] = [0; 1; 2; 3] ;;
- : int list = [1; 2; 3]
Concaténation
# [0; 1] @ [2; 3] ;;
- : int list = [0; 1; 2; 3]
Slide: 46
Listes polymorphes homogènes (3/3)
Listes homogènes
# [1; "mai"] ;;
This expression has type string but is here used with type int
Objective Caml est un langage fonctionnel
# [String.uppercase; String.lowercase] ;;
- : (string -> string) list = [<fun>; <fun>]
# (List.hd [String.uppercase; String.lowercase]) "hello" ;;
- : string = "HELLO"
Slide: 47
Manipuler des listes
Slide: 48
Filtrage (1/7)
Destructurer ce qui a été construit
Définition par cas de constructeur: opérateur match
# let rec sum ns =
match ns with
[] -> 0
| n::ns' -> n + (sum ns') ;;
val sum : int list -> int = <fun>
# sum [6; 60; 600] ;;
- : int = 666
Slide: 49
Filtrage (2/7)
Motifs de filtrage : constructeurs et variables
Un motif fabrique une liaison
# let head_and_tail xs =
match xs with
[] -> failwith "empty"
| x::xs' -> x, xs' ;;
val head_and_tail : 'a list -> 'a * 'a list = <fun>
# head_and_tail [0; 1; 2] ;;
- : int * int list = 0, [1; 2]
Slide: 50
Filtrage (3/7)
Liaisons inutiles: motif universel _ (souligné)
# let head_only xs =
match xs with
[] -> failwith "empty"
| x::_ -> x ;;
# head_only [0; 1; 2] ;;
- : int = 0
Slide: 51
Filtrage (4/7)
L'évaluation du filtrage est séquentielle
# let bad_head_only xs =
match xs with
_ -> failwith "first pattern"
| x::_ -> x ;;
Warning: this match case is unused.
# bad_head_only [0; 1; 2] ;;
Uncaught exception: Failure "first pattern".
Slide: 52
Filtrage (5/7)
Du travail en profondeur
# let rec pairing xs =
match xs with
[] -> []
| [x] -> failwith "should be of even length"
| x1::x2::xs' -> (x1,x2)::(pairing xs') ;;
Alternative
# let rec pairing xs =
match xs with
[] -> []
| x1::x2::xs' -> (x1,x2)::(pairing xs')
| _ -> failwith "should have even elements" ;;
Slide: 53
Filtrage (6/7)
Du travail encore plus en profondeur
# let rec rem_zero nss =
match ns with
[] -> []
| 0::ns' -> rem_zero ns'
| n::ns' -> n::(rem_zero ns') ;;
val rem_zero : int list -> int list = <fun>
# rem_zero [1; 0; 2; 0; 0; 3] ;;
- : int list = [1; 2; 3]
Notez: les (notations de) constantes entières sont des motifs
Slide: 54
Filtrage (7/7)
Un motif est linéaire
# let rec rem_dup xs =
match xs with
x::x::xs' -> rem_dup (x::xs')
| x::xs' -> x::(rem_dup xs')
| _ -> xs ;;
This variable is bound several times in this matching
Le motif x::x::xs' contient deux occurences de la
variable x
Slide: 55
Fonctionnelles (1/3)
Objective Caml est un langage fonctionnel
Appliquer un même traitement
val iter : ('a -> unit) -> 'a list -> unit
List.iter f [a1; ...; an] º f a1; f a2; ...; f an; ()
# let print_int_list =
let print_fun n = Printf.printf"(%d)" n in
List.iter print_fun
;;
val print_int_list : int list -> unit = <fun>
# print_int_list [0; 1; 2; 3] ;;
(0)(1)(2)(3)- : unit = ()
Slide: 56
Fonctionnelles (2/3)
Appliquer un même traitement et reconstruire
val map : ('a -> 'b) -> 'a list -> 'b list
List.map f [a1; ...; an] º [f a1; ...; f an]
# let rev_pairs xys =
let f (x,y) = (y,x) in
List.map f xys
;;
val rev_pairs : ('a * 'b) list -> ('b * 'a) list = <fun>
# rev_pairs [1,true; 2,false; 3,true; 4,false] ;;
- : (bool * int) list = [true, 1; false, 2; true, 3; false, 4]
Slide: 57
Fonctionnelles (3/3)
Composition
val fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
List.fold_right f [a1; ...; an] b
º f a1 (f a2 (... (f an b) ...))
# let sum ns = List.fold_right (+) ns 0 ;;
val sum : int list -> int = <fun>
# sum [1; 2; 3; 4] ;;
- : int = 10
Remarque: (+) est la version préfixée de l'opérateur +
let (+) x y = x + y ;;
Slide: 58
Types utilisateurs
Slide: 59
Types union (1/3)
Définir son propre ensemble de constructeurs
# type int_or_float =
Int_value of int
| Float_value of float ;;
Remarquez: initiales des constructeurs obligatoirement en majuscules
Les valeurs
# Int_value 1 ;;
- : int_or_float = Int_value 1
# Float_value 1.5 ;;
- : int_or_float = Float_value 1.500000
Slide: 60
Types union (2/3)
Filtrage
# let add x y =
match x, y with
Int_value n1, Int_value n2 -> Int_value (n1 + n2)
| Float_value x1, Float_value x2 -> Float_value (x1 +. x2)
| _ -> failwith "type error" ;;
Remarquez: la construction du couple pour le filtrage
Slide: 61
Type union (3/3)
Objective Caml est un langage fonctionnel
# type fun_and_arg =
Arg of int
| Fun of (int -> int) ;;
[...]
# let apply t =
match t with
Fun f, Arg x -> f x
| _ -> failwith"some this wrong"
;;
val apply : fun_and_arg * fun_and_arg -> int = <fun>
# apply (Fun succ, Arg 1) ;;
- : int = 2
Slide: 62
Type récursifs (1/2) *
Arbres binaires
Version monomorphe
# type int_btree =
Empty
| Node of int_btree * int * int_btree ;;
Version paramétrique
# type 'a btree =
Empty
| Node of 'a btree * 'a * 'a btree ;;
-----
* Erratum: int_btree * 'a * int_btree
Slide: 63
Type récursifs (2/2)
Parcours générique
let rec btree_fold f a t =
match t with
Empty -> a
| Node(t1, x, t2)
-> f x (btree_fold f a t1) (btree_fold f a t1)
;;
val btree_fold :
('a -> 'b -> 'b -> 'b) -> 'b -> 'a btree -> 'b = <fun>
Slide: 64
Types mutuellement récursifs (1/3)
Arbres et forêts
# type 'a tree =
Leaf
| Branch of 'a * 'a forest
and 'a forest =
Empty
| Cons of 'a tree * 'a forest
;;
Slide: 65
Types mutuellement récursifs (2/3)
Parcours générique
# let rec tree_fold f a g b t =
match t with
Leaf -> a
| Branch (x, ts) -> f x (forest_fold f a g b ts)
and forest_fold f a g b ts =
match ts with
Empty -> b
| Cons (t, ts')
-> g (tree_fold f a g b t) (forest_fold f a g b ts')
;;
Slide: 66
Types mutuellement récursifs (3/3)
Type des parcours génériques
val tree_fold :
('a -> 'b -> 'c) -> 'c -> ('c -> 'b -> 'b) -> 'b
-> 'a tree -> 'c = <fun>
val forest_fold :
('a -> 'b -> 'c) -> 'c -> ('c -> 'b -> 'b) -> 'b
-> 'a forest -> 'b = <fun>
Aux limites de l'abstraction fonctionnelle
Slide: 67
Types produits: enregistrements (1/5)
Nommer les champs d'un n-uplet
# type fiche =
{ nom: string;
prenom: string;
naissance: int*int*int } ;;
Oublier leur ordre
# let f1 = { prenom = "Gilberte";
naissance = 01,01,01;
nom = "Albertine" } ;;
val f1 : fiche =
{nom="Albertine"; prenom="Gilberte"; naissance=1, 1, 1}
Slide: 68
Types produits: enregistrements (2/5)
Accés, notation pointée
# f1.nom ;;
- : string = "Albertine"
Accés, par filtrage
# let get_nom f =
match f with
{nom=x} -> x
;;
val get_nom : fiche -> string = <fun>
# get_nom f1 ;;
- : string = "Albertine"
Slide: 69
Types produits: enregistrements (3/5)
Champs fonctionnels
# type t = { value: int; next: int -> int } ;;
[...]
# let e0 = { value = 0; next = succ } ;;
val e0 : t = {value=0; next=<fun>}
Construction ... with ...
# let e1 = { e0 with value = e0.next e0.value } ;;
val e1 : t = {value=1; next=<fun>}
Slide: 70
Types produits: enregistrements (4/5)
Types (naturellement) récursifs
type t = { value: int; next: t -> t } ;;
[...]
# let e1 =
let succ_t e = { e with value = succ e.value } in
{ value = 2; next = succ_t } ;;
val e1 : t = {value=2; next=<fun>}
# let e2 =
let square_t e = { e with value = e.value * e.value } in
{ value = 2; next = square_t } ;;
val e2 : t = {value=2; next=<fun>}
Slide: 71
Types produits: enregistrements (5/5)
Une succession qui dépend de l'argument initial
# let next_t e = e.next e ;;
val next_t : t -> t = <fun>
# let e1' = next_t e1 ;;
val e1' : t = {value=3; next=<fun>}
# let e1'' = next_t e1' ;;
val e1' : t = {value=4; next=<fun>}
# let e2' = next_t e2 ;;
val e2' : t = {value=4; next=<fun>}
# let e2'' = next_t e2' ;;
val e2'' : t = {value=16; next=<fun>}
Slide: 72
Des expressions
Slide: 73
L'application
Syntaxe: juxtaposition simple
e1 e2 ...en
Valeur: dépend du type
si e1:t2 -> t1 et si
e2:t2 alors e1 e2:t1
Évaluation (ordre d'): argument(s) d'abord
# let f x = print_string" puis j'oublie mon argument\n" ;;
val f : 'a -> unit = <fun>
# f (print_string"je suis l'argument") ;;
je suis l'argument puis j'oublie mon argument
- : unit = ()
Slide: 74
L'abstraction
Syntaxe: liaison
fun x -> e
Valeur: fermeture
Fige l'évaluation de e en attente de la valeur de x
# fun x -> failwith"j'ai oublie mon argument" ;;
- : 'a -> 'b = <fun>
# (fun x -> failwith"j'ai oublie mon argument") "Go" ;;
Uncaught exception: Failure "j'ai oublie mon argument".
Type:
de type t1 -> t2,
si e:t2 en supposant x:t1
Slide: 75
La séquence (structure de contrôle (1/3))
Syntaxe:
e1; e2; ...; en
Valeur: valeur de en
Évaluation (ordre d'): de gauche à droite
# print_string"je vaux "; 2001 ;;
je vaux - : int = 2001
# failwith"je m'arrete la"; 2001 ;;
Uncaught exception: Failure "je m'arrete la".
Slide: 76
L'alternative (structure de contrôle (2/3))
Syntaxe:
if e1 then e2 else e3
Valeur: celle de e2 ou e3
Évaluation (ordre d'): e1, puis e2 ou e3
# if true then 20/20 else 0/0 ;;
- : int = 1
# (if true then 20/20 else 0/0) + 10 ;;
- : int = 11
Slide: 77
Le filtre (structure de contrôle (3/3))
Syntaxe:
match e with p1 -> e1 | ...| pn -> en
Valeur: celle du premier ei tel que pi filtre e
Évaluation (ordre d'): e, puis, et seulement lui, le ei sélectionné
# match failwith"je ne ressemble a rien" with _ -> 0/0 ;;
Uncaught exception: Failure "je ne ressemble a rien".
# (match true with false -> 0/0 | true -> 20/20) + 10 ;;
- : int = 11
Slide: 78
Définition locale
Syntaxe:
let x = e1 in e2
Valeur: celle de e2 quand x vaut celle de e1
Évaluation (ordre d'): e1 d'abord, puis e2
# let x = print_string"je vaux " in 1 ;;
je vaux - : int = 1
# let x = failwith"je ne vaux rien" in 1 ;;
Uncaught exception: Failure "je ne vaux rien".
Slide: 79
Des programmes
Slide: 80
Déclarations globales
Syntaxe:
let x = e
Effet: attribut à x la valeur de e
Variations
# let a = 3 and b = 5 and c = 7 ;;
[...]
# let fun_poly = fun x -> fun y -> a*x*x + b*y + c ;;
val fun_poly : int -> int -> int = <fun>
# fun_poly 1 2 ;;
- : int = 20
Slide: 81
Schéma de programmes *
(* Commentaire de programme *)
(* Declarations globales *)
let x1 = e1
:
let xn = en
(* Expression principale *)
en+1
-
Les déclarations créent l'environnement d'évaluation
- L'expression principale déclanche l'évaluation
-----
* Erratum: tout faux !
This document was translated from LATEX by
HEVEA.