Postscript, PDF | Site Polytechnique | Site INRIA |
|
Cours | Exercises |
|
|
|
· | Regarder les solutions d'exercises |
· | Réutiliser et modifier le code déjà écrit. |
· | la documentation: le manuel de référence, la librairie du noyau et les librairies standards. |
· | le tutorial, l'expérience des autres (FAQ). |
· | les librairies développées par les utilisateurs (voir aussi la page ocaml). |
· | 1975
Robin Milner propose ML comme méta-langage (langage de script) pour
l'assistant de preuve LCF. Il devient rapidement un langage de programmation à part entière |
· | 1981 Premières implantations de ML |
· | 1985
Développement de Caml à l'INRIA.
et en parrallèle,
de Standard ML à Edinburgh,
de SML à New-Jersey,
de Lazy ML à Chalmers,
de Haskell à Glasgow, etc.
|
· | 1990Implamtation de Caml-Light par X. Leroy and D. Doligez |
· | 1995 Compilateur vers du code natif + système de modules |
· | 1996 Objets et classes (Ocaml) |
· | 2000 Arguments étiquettés et optionnels, variants par J. Garrigue. |
|
· | Calcul symbolique: Preuves mathématiques, compilation, interprétation, analyses de programmes. |
· | Prototypage rapide. |
· | Langage de script. |
· | Programmation distribuée (bytecode rapide). |
· | Classes préparatoires. |
· | Utilisé dans de grandes universités (Europe, US, Japon, etc.). |
· | Startups, CEA, EDF, France Telecom, Simulog,... |
|
· | fonctionnel: les fonctions sont des valeurs de première classe, elles peuvent être retournées en résultat et passées en argument à d'autres fonctions. |
· | à gestion mémoire automatique (comme JAVA) |
· | fortement typé: le typage garantit l'absence d'erreur (de la machine) à l'exécution. |
· | avec synthèse de types: les types sont facultatifs et synthétisés par le système. |
· | compilé ou interactif (mode interactif = grosse calculette) |
· | une couche à objets sophistiquée, |
· | un système de modules très expressif. |
|
|
|
|
|
|
% ocaml < bienvenue.ml |
équivalent à la version interactive | |
% ocaml bienvenue.ml |
idem, mais suppression des messages |
|
|
~/.emacs
.· |
Appeler Ocaml par la commande run-caml
|
· |
Ouvrir un fichier bienvenue.ml ,Écrire les phrases dans ce fichier, Exécuter la commande eval-phrase dans le menu caml .
(éventuellement, appeler start - subshell dans le menu caml .)
|
compile
dans le menu caml
.return
.
|
-- définition de valeur | let x = e |
|
-- définition de fonction | let f x ... xn = e |
|
-- définition de fonctions | let [ rec ] f1 x1 ... = e1 ... |
|
mutuellement récursives | [ and fn xn ... = en] |
|
-- définition de type(s) | type q1 = t1... [ and qn = tn ] |
|
-- expression | e |
;;
optionnel en général.
|
|
-- définition locale | let x = e1 in e2 |
||
(définition locale de fonctions mutuellement récursives) | |||
-- fonction anonyme | fun x1 ... xn -> e |
||
-- appel de fonction | f x1 ... xn | ||
-- variable | x (M.x si x est défini dans M) | ||
-- valeur construite | (e1, e2) | ||
dont les constantes | 1, 'c', "aa" | ||
-- analyse par cas | match e with p1
-> e1 ... | pn
-> en |
||
-- boucle for | for i = e0 [down ]to ef do e done |
||
-- boucle while | while e0 do e done |
||
-- conditionnelle | if e1 then e2 else e3 |
||
-- une séquence | e; e ' | ||
-- parenthèses | (e) begin e end |
|
()
de type
unit
ne porte aucune information (unique valeur possible dans son
type). for
et while
et dans la séquence
doit être de type unit
.-- en utilisant une fonction
|
-- en utilisant une définition:
|
|
unit | () |
pas d'opération! |
bool | true false | && || not |
char | ' a ' '\ n ' '\097' |
code chr |
int | 1 2 3 | + - * / max_int |
float | 1.0 2. 3.14 | +. -. *. /. cos |
string | "a\tb\010c\n" |
^ s .[ i ] s .[ i ] |
Polymorphes | ||
tableaux | - c[| |
t .( i ) t .( i ) |
tuples | (1, 2) (1, 2, 3, 4) | fst snd |
- v(+)
x1 x2 est équivalent à x1 +
x2
|
[| |
: | int
array |
[| true ; false
|
: | bool
array |
fun
x
x .(0) |
: | ' a
array
a |
fun
t
k
x
t .( k ) x |
: | ' a
array
int
a
unit |
Array . create |
: | int
a
a
array |
|
-- une paire | (1, |
: | int
int |
-- un triplet | (1, |
: | int
int
int |
fun
x , y , z ) x |
: | (' a
b
c ) a |
fst |
: | ' a
b
a |
snd |
: | ' a
b
b |
|
let
plus
x
y
x
y |
: | int
int
int |
let
plus
x , y ) x
y |
: | int
int
int |
|
|
|
|
|
|
|
|
|
|
&
x
ou *
x
en C qui
retourne l'adresse à laquelle se trouve une valeur ou la valeur qui se
trouve à une adresse.
La valeur d'une variable n'est pas modifiable |
|
En C
|
En Ocaml
|
Raccourci:
|
|
Sys
.
argv
:
string
array
echo
|
"-n"
qui
qui a pour effet de ne pas imprime de fin de ligne.
Arg
permet de lire ces arguments plus facilement.
|
exit |
: | int
unit |
true
et false
qui ne font rien la
première retourne le code 0, la seconde le code 1.
|
|
|
|
Canaux pré-définis
|
Ouverture de canaux
|
Lecture sur stdin
|
Écriture sur stdout
|
· | Voir la librairie noyau | ||||||
· | Voir la librairie Printf
par exemple, on écrira comme en C:
|
|
|
(
fun
x
->
f
(
g
x
)
est anonyme. Les définitions
|
|
|
|
|
|
|
Les constructeurs sont toujours capitalisés |
|
|
|
|
|
|
|
Types récursifs
|
Les listes de la librairie
|
|
|
|
|
|
|
|
|
|
->
e1 | ... | pn
->
en· | la première clause qui filtre l'argument est exécutée, les autres sont ignorées. |
· | si aucune clause ne filtre l'argument, une exception est levée. |
|
|
· | être emboîtés, contenir des produits et des sommes |
· | ne pas énumérer tous les champs des enregistrements |
· | lier une valeur intermédiaire avec mot clé as |
· |
n'imposer aucune contrainte (représentés par le caractère _ )
|
|
|
double
des listes à ``double entrée'', ie. ayant un
constructeur supplémentaire permettant d'ajouter un élément en fin de liste.
|
list_of_double
qui transforme une liste double en
une liste simple (de la librairie).
|
compatibles
qui prend un
ensemble de cartes et retourne l'ensemble de toutes les sous-parties
compatibles les plus larges possibles.
La seule difficulté provient de la carte Joker
, qui peut remplacer
n'importe quelle autre carte. Un joker est compatibles avec deux cartes qui
ne sont pas compatibles entre elles. La relation de compatibilité n'est donc
pas une relation d'équivalence.meilleure
:
la carte Joker
est meilleure que la carte Roi
, mais pas
l'inverse.
|
compatibles
est définie pas induction.
Si la main est vide, l'ensemble des parties compatibles est vide.
Si le premier élément de la main est un joker, alors les parties compatibles
sont celles du reste de la main dans chacune desquelles il faut ajouter un
jojer. Sinon, le premier élément est une carte ordinaire: les parties
compatibles sont d'une part l'ensemble des cartes compatibles avec celle-ci,
et l'ensemble des parties compatibles avec les cartes qui ne sont pas
compatibles avec celle-ci.
|
|
|
sigma
:
('
a
-
>
int
)
-
>
'
a
list
-
>
int
telle que
l'expression sigma
f
l
calcule la formule åx Î l
f(x).
|
pi
:
'
a
list
-
>
('
a
-
>
int
)
-
>
int
analogue mais en remplaçant la somme par le produit.
|
|
fold
, d'abord une seule fonction globale récursives,
puis utiliser une fonction locale récursive auxilliaire en lui passant le
minimum d'argument(s).
|
|
|
|
|
-- Définition (phrase) | exception C [ of t ] |
-- Levée (expression) | raise e |
-- Filtrage (expression) | try e with p1 e1 ... | pn en |
Exception | Usage | gravité |
Invalid_argument
of
string |
accès en dehors des bornes | forte |
Failure
of
string |
liste vide, retourne le nom de la fonction | moyenne |
Not_found
of
unit |
fonctions de recherche | nulle |
Match_failure
of
|
Échec de filtrage | fatale |
End_of_file |
Fin de fichier | nulle |
|
· | Le type exn est un type somme. | ||||||
· | La levée d'une exception arête l'évaluation en cours et retourne une valeur ``exceptionnelle'' (du type exn). | ||||||
· |
Une exception ne peut être éventuellement rattrapée que si elle a été
protégée par une expression try e1 with m
| ||||||
· |
On peut observer une exception (ie. l'attraper et la relancer):
|
|
· |
reporter une erreur et interrompre le calcul en cours; Par exemple, l'exception Match_failure est levée à l'exécution
lorsqu'une valeur n'est pas filtrée. Elle indique le nom du fichier et la
position filtre en cause. |
· |
communiquer une valeur de retour rare ou particulière; Par exemple, les exceptions Not_found et End_of_file sont
utilisées pour programmer et leur levées sont tout à fait normales. |
|
|
|
|
f
, un tableau et
un indice et qui calcule åi = jk f (t.(i))-
carre
ou -
moyenne
, alors il calcule la somme ou la
moyenne des éléments restants.
|
|
|
|
|
->
unit
. Les valeurs du types t sont alors
imprimées avec le nouvelle fonction.ocamlc
-
g
ocamldebug
nom-du-programmecamldebug
(faire ESC
x
camldebug
nom-du-programme)
|
|
|
identité
est polymorphe.
|
|
|
apply
doivent avoir le même type.
|
|
|
r
n'est pas polymorphe (c'est une application). '
_a
ne sont pas des variables polymorphes.
Elles sont dites faibles; elles représentent un type particulier mais
pas encore connu. f
:
|
|
|
|
· | Pour éviter un gros calcul inutile. |
· | Pour retarder ou répéter les effets de bord associé au calcul. |
|
|
ifzéro
avec le type int
->
(
unit
->
'
a
)
->
(
unit
->
'
a
)
->
'
a
. On donnera le programme
corrigé complet.
La fonction ifzéro
évalue ses deux arguments
(de plus l'ordre d'évaluation n'est pas déterminé). unit
->
'
a
.
|
|
|
hd
, tl
et nth
sur les streams
qui retourne le premier élément, le reste du stream, et le nième
élément.
|
nil
, cons
:
'
a
-
>
'
a
stream
-
>
'
a
stream
et une fonction freeze
:
(
unit
-
>
('
a
*
'
a
stream
))
-
>
'
a
stream
,
qui retourne le stream vide, ajoute un élément explicite
en tête d'un stream et construit un stream à partir d'une fonction
génératrice.
|
|
filter
:
('
a
-
>
bool
)
-
>
'
a
stream
-
>
'
a
stream
qui prend un prédicat un stream et retourne le stream des éléments qui
satisfont les prédicat. En déduire le stream des entiers pairs à partir
du stream des entiers.
|
|
· | duplication du code, et des erreurs! |
· | difficulté de maintenance. |
|
Rendre les gros programmes compilables |
Rendre les gros programmes compréhensibles |
Rendre les gros programmes maintenables |
Rendre les composantes réutilisables |
|
|
· | Le fichier d'implémentation A.ml: une suite de phrases. |
· | Le fichier d'interface A.mli (optionnel): une suite de spécifications. |
spécification de valeurs | val x : s |
spécification de types abstraits | type t |
spécification de types manifestes | type t = t |
spécification d'exceptions | exception E |
|
ocamlc -c a.mli | compile l'interface de A |
crée a . cmi |
ocamlc -c a.ml | compile l'implémentation de A |
crée
a . cmo |
ocamlc -c b.ml | compile l'implémentation de B |
crée b . cmo |
ocamlc -o monprog a.cmo b.cmo édition de liens finale |
|
· | Copier Makefile dans votre dossier de travail. |
· |
Éditer les variables SOURCES et EXEC (au plus un exécutable à la fois) |
· |
Faire make
|
· |
Au premier appel, si un message indique l'absence d'un fichier
. depend , alors est nécessaire de faire touch
depend .
|
|
Makefile
)Makefile
.
|
· | Langages de programmation. |
· | Modularité, Objets et types. |
This document was translated from LATEX by HEVEA.