Slide: 1


Le langage Objective Caml
(Prise en main de)
figure=logocaml-petit.ps


Slide: 2


Caractéristiques


Slide: 3




Histoire


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

  1. Types et opérateurs numériques
  2. Définir et utiliser des fonctions (sur les nombres)
  3. Manipuler les nombres
  4. Autres types de base simples
  5. Types et structures de données paramétrés
  6. Manipuler ces types
  7. Types utilisateurs
  8. Des expressions (synthèse)
  9. Des programmes

Slide: 8


Types et opérateurs numériques


Slide: 9


Les nombres


Slide: 10


Les nombres - notation (1/3)

On utilise la boucle d'interaction ocaml

Entiers, décimale
# 1 ;;
- : int = 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
 
& synonyme
or synonyme
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
  1. int -> int -> int º int -> (int -> int)
  2. 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


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 x
1 = e1
:
let x
n = en
(* Expression principale *)
e
n+1

  1. Les déclarations créent l'environnement d'évaluation
  2. L'expression principale déclanche l'évaluation


-----
* Erratum: tout faux !




This document was translated from LATEX by HEVEA.