Langage OCaml
Programme de MP2I/MPI
La présente annexe liste limitativement les éléments du langage OCaml (version 4 ou supérieure) dont la connaissance, selon les modalités de chaque sous-section, est exigible des étudiants. Aucun concept sous-jacent n’est exigible au titre de la présente annexe.
Traits et éléments techniques à connaître
Les éléments et notations suivants du langage OCaml doivent pouvoir être compris et utilisés par les étudiants sans faire l’objet d’un rappel, y compris lorsqu’ils n’ont pas accès à un ordinateur.
Traits généraux
- Typage statique, inférence des types par le compilateur. Idée naïve du polymorphisme.
- Passage par valeur.
- Portée lexicale : lorsqu’une définition utilise une variable globale, c’est la valeur de cette variable au moment de la définition qui est prise en compte.
- Curryfication des fonctions. Fonction d’ordre supérieur.
- Gestion automatique de la mémoire.
- Les retours à la ligne et l’indentation ne sont pas signifiants mais sont nécessaires pour la lisibilité du code.
Définitions et types de base
let,let rec(pour des fonctions),let rec ... and ...,fun 𝑥 𝑦->𝑒.let 𝑣 =𝑒 in 𝑒′,let rec 𝑓 𝑥=𝑒 in 𝑒′.- Expression conditionnelle
if 𝑒 then 𝑒𝑉 else 𝑒𝐹. - Types de base :
intet les opérateurs+,-,*,/, l’opérateurmodquand toutes les grandeurs sont positives; exceptionDivision_by_zero;floatet les opérateurs+.,-.,*.,/.;bool, les constantestrueetfalseet les opérateursnot,&&,||(y compris évaluation paresseuse). Entiers et flottants sont sujets aux dépassements de capacité. - Comparaisons sur les types de base :
=,<>,<,>,<=,>=. - Types char et string;
'𝑥'quand 𝑥 est un caractère imprimable,"𝑥"quand 𝑥 est constituée de caractères imprimables,String.length,𝑠.[𝑖], opérateur^. Existence d’une relation d’ordre total sur char. Immuabilité des chaînes.
Types structurés
- n-uplets; non-nécessité d’un match pour récupérer les valeurs d’un n-uplet.
- Listes : type
'a list, constructeurs[]et::, notation[𝑥; 𝑦; 𝑧]; opérateur@(y compris sa complexité);List.length. Motifs de filtrage associés. - Tableaux : type
'a array, notations[|...|] , 𝑡.(𝑖), 𝑡.(𝑖) <- 𝑣; fonctionslength,make, etcopy(y compris le caractère superficiel de cette copie) du moduleArray. - Type
'a option. - Déclaration de type, y compris polymorphe.
- Types énumérés (ou sommes, ou unions), récursifs ou non; les constructeurs commencent par une majuscule, contrairement aux identifiants. Motifs de filtrage associés.
- Filtrage :
match 𝑒 with 𝑝0 -> 𝑣0 | 𝑝1 -> 𝑣1 ...; les motifs ne doivent pas comporter de variable utilisée antérieurement ni deux fois la même variable; motifs plus ou moins généraux, notation_, importance de l’ordre des motifs quand ils ont des instances communes.
Programmation impérative
- Absence d’instruction; la programmation impérative est mise en œuvre par des expressions impures;
unit,(). - Références : type
'a ref, notationsref,!,:=. Les références doivent être utilisées à bon escient. - Séquence;. La séquence intervient entre deux expressions.
- Boucle
while c do b done; bouclefor v = d to f do b done.
Divers
- Usage de
begin ... end. print_int,print_float,print_string,read_int,read_float,read_line.- Exceptions : levée et filtrage d’exceptions existantes avec
raise,try ... with ...; dans les cas irrattrapables, on peut utiliserfailwith. - Utilisation d’un module : notation
𝑀.𝑓. Les noms des modules commencent par une majuscule. - Syntaxe des commentaires, à l’exclusion de la nécessité d’équilibrer les délimiteurs dans un commentaire.
Éléments techniques devant être reconnus et utilisables après rappel
Les éléments suivants du langage OCaml doivent pouvoir être utilisés par les étudiants pour écrire des programmes dès lors qu’ils ont fait l’objet d’un rappel et que la documentation correspondante est fournie.
Traits divers
- Types de base : opérateur
modavec opérandes de signes quelconques, opérateur**. - Types enregistrements mutables ou non, notation
{c0 : t0 ; c1 : t1 ;...},{ c0 : t0 ; mutable c1: t1 ;...}; leurs valeurs, notations{c0 = v0 ; c1 = v1 ; ...}, e.c, e.c <- v. - Fonctions de conversion entre types de base.
- Listes : fonctions
mem,exists,for_all,filter,map,iterdu moduleList. - Tableaux : fonctions
make_matrix,init,mem,exists,for_all,mapetiterdu moduleArray. - Types mutuellement récursifs.
- Filtrage : plusieurs motifs peuvent être rassemblés s’ils comportent exactement les mêmes variables.
Notation function
p0 -> v0 | p1 -> v1 .... - Boucle for
v = f downto d do b done. - Piles et files mutables : fonctions
create,is_empty,pushetpopdes modulesQueueetStackainsi que l’exceptionEmpty. - Dictionnaires mutables réalisés par tables de hachage sans liaison multiple ni randomisation par le
module
Hashtbl: fonctionscreate,add,remove,mem,find( y compris levée deNot_found),find_opt,iter. Sys.argv.- Utilisation de
ocamlcouocamloptpour compiler un fichier dépendant uniquement de la bibliothèque standard.
Gestions des ressources de la machine
- Gestion de fichiers : fonctions
open_in,open_out,close_in,close_out,input_line,output_string. - Fils d’exécution : recours au module
Thread, fonctionsThread.create,Thread.join. - Mutex : recours au module
Mutex, fonctionsMutex.create,Mutex.lock,Mutex.unlock.