From c2620053a2695ac891f680301687cb6cf9d867aa Mon Sep 17 00:00:00 2001 From: Emmanuel Coquery <emmanuel.coquery@univ-lyon1.fr> Date: Wed, 22 Jan 2025 16:23:37 +0100 Subject: [PATCH] TP1 --- tp/tp1.md | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/tp/tp1.md b/tp/tp1.md index 91dd6ea..c71ac88 100644 --- a/tp/tp1.md +++ b/tp/tp1.md @@ -1,7 +1,5 @@ # TP1: Découverte du langage OCaml -Version 2024 - ## 0. Environnement de travail Les TPs s'effectueront sous Linux. @@ -15,7 +13,11 @@ Vérifier que l'extension "OCaml Platform" est installée dans VSCode, l'install Créer un fichier `tp1.ml`, ouvrir ce fichier avec Visual Studio Code. Le plugin OCaml permet d'exécuter un code sélectionné avec les touches `[Shift] + [Enter]`. -## 1. Premiers pas avec l'interpréteur +## Partie 1 + +Quand vous aurez fini cette partie, prévenez votre chargé de TP. + +### 1.1. Premiers pas avec l'interpréteur Lancer l'interpréteur `ocaml` avec la commande @@ -29,9 +31,9 @@ ou simplement ocaml ``` -si `utop` n'est pas installé. +si `utop` n'est pas installé (sur la machine de l'université, cela veut dire que vous n'avez probablement pas correctement suivi les instructions de [CONFIGURATION.md](../CONFIGURATION.md)). -### 1.1. Types de base +#### 1.1.1. Types de base On va commencer par utiliser l'interpréteur comme une calculatrice avancée. Dans l'interpréteur, les expressions à calculer **doivent** se terminer par `;;`. @@ -72,7 +74,7 @@ Les opérateurs de comparaison s'écrivent `=` (attention il y a bien un seul si > 3 < 2.0;; > ``` -### 1.2. Appels de fonction +#### 1.1.2. Appels de fonction En OCaml, les appels de fonctions sont sous la forme `f a1 a2 a3` où `f` est la fonction et `a1`, `a2` et `a3` sont les arguments (les paramètres effectifs) @@ -108,7 +110,7 @@ Remarque : les opérateurs en OCaml sont **aussi** des fonctions. En ajoutant de > 2 < 3 && "b" < "ab" > ``` -### 1.3. Variables +#### 1.1.3. Variables Pour rappel, la syntaxe des définitions de variables est : @@ -132,7 +134,7 @@ let x2 = x1 *. x1 in x2 *. 2.0 ;; ``` -### 1.4 Conditionnelle +#### 1.1.4 Conditionnelle La conditionnelle `if ... then ... else ...` est une **expression** et pas une _instruction_ en OCaml, c'est-à -dire qu'elle a un résultat. @@ -142,7 +144,7 @@ La conditionnelle `if ... then ... else ...` est une **expression** et pas une _ > (if true then 3 else 5) > 4 > ``` -## 2. Définition de fonctions +### 1.2. Définition de fonctions La construction `let` _sans_ le `in` permet de définir des variables _globales_. On peut l'utiliser pour définir des fonctions comme suit: @@ -193,9 +195,9 @@ Cette fonction est utile pour trouver les racines d'un trinôme. **Dans la suite de ce TP et pour les autres TP**, on écrira _toujours_ un commentaire spécial avant la définition d'une fonction définie globalement. Et on écrira toujours ce **commentaire avant de commencer à coder** la fonction. -## 3. Types somme +### 1.3. Types somme -### 3.1 Définitions de types somme +#### 1.3.1 Définitions de types somme Les types somme en OCaml sont des types dont les valeurs peuvent être construites de différentes manières. L'exemple suivant illustre la syntaxe de définition de ces types : @@ -243,7 +245,7 @@ Remarque: quand on passe plusieurs arguments à un constructeur, ils sont passé > En utilisant l'interpréteur, indiquer quel est le type de `(3, 5.6)`. Quelle est la différence avec `(3, 5, 6)` ? -### 3.2 Pattern matching +#### 1.3.2 Pattern matching OCaml possède la construction `match ... with ...` qui permet de décider de l'expression à évaluer en fonction de la valeur de l'expression indiquée dans le `match`. Par exemple: @@ -290,7 +292,12 @@ On veut implémenter un générateur pour les paroles de la chanson [99 bottles > utilisera `match` pour distinguer les cas 0, 1 ou 2 bouteilles du cas général > à _n_ bouteilles. -## 4. Récursivité +Fin de la partie 1. +Si vous avez fini en séance, prévenez votre chargé de TP qui va vérifier que vous avez compris. + +## Partie 2 + +### 2.1. Récursivité Dans le cas de fonctions récursives, il faut ajouter le mot clé `rec` après le `let`: @@ -308,7 +315,7 @@ let rec sum_n (n:int): int = > Écrire une fonction `factorielle` qui calcule le produit des entiers entre 1 et _n_. -## 5. Listes +### 2.2. Listes OCaml possède une structure de liste prédéfinie. La liste vide d'écrit `[]` et l'ajout en tête de liste est réalisé par l'opérateur `::`. Cet opérateur est @@ -377,3 +384,5 @@ valeur de liste par cas avec un `match` et fabriquer une liste comme résultat. > complètes de la chanson _99 bottles of beer_. On séparera chaque paragraphe du > suivant avec "\n\n". Vérifier que la variable a la bonne valeur en l'affichant > avec `print_endline chanson_99_bottles;;` . + +Fin de la 2eme partie et du TP. Prévenez votre chargé de TP si vous avez fini cette partie en séance. -- GitLab