Skip to content
Snippets Groups Projects
Commit c2620053 authored by COQUERY EMMANUEL's avatar COQUERY EMMANUEL
Browse files

TP1

parent b6630ce4
No related branches found
No related tags found
No related merge requests found
# TP1: Découverte du langage OCaml # TP1: Découverte du langage OCaml
Version 2024
## 0. Environnement de travail ## 0. Environnement de travail
Les TPs s'effectueront sous Linux. Les TPs s'effectueront sous Linux.
...@@ -15,7 +13,11 @@ Vérifier que l'extension "OCaml Platform" est installée dans VSCode, l'install ...@@ -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. 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]`. 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 Lancer l'interpréteur `ocaml` avec la commande
...@@ -29,9 +31,9 @@ ou simplement ...@@ -29,9 +31,9 @@ ou simplement
ocaml 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. On va commencer par utiliser l'interpréteur comme une calculatrice avancée.
Dans l'interpréteur, les expressions à calculer **doivent** se terminer par `;;`. 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 ...@@ -72,7 +74,7 @@ Les opérateurs de comparaison s'écrivent `=` (attention il y a bien un seul si
> 3 < 2.0;; > 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``f` est la En OCaml, les appels de fonctions sont sous la forme `f a1 a2 a3``f` est la
fonction et `a1`, `a2` et `a3` sont les arguments (les paramètres effectifs) 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 ...@@ -108,7 +110,7 @@ Remarque : les opérateurs en OCaml sont **aussi** des fonctions. En ajoutant de
> 2 < 3 && "b" < "ab" > 2 < 3 && "b" < "ab"
> ``` > ```
### 1.3. Variables #### 1.1.3. Variables
Pour rappel, la syntaxe des définitions de variables est : Pour rappel, la syntaxe des définitions de variables est :
...@@ -132,7 +134,7 @@ let x2 = x1 *. x1 in ...@@ -132,7 +134,7 @@ let x2 = x1 *. x1 in
x2 *. 2.0 ;; 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. 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 _ ...@@ -142,7 +144,7 @@ La conditionnelle `if ... then ... else ...` est une **expression** et pas une _
> (if true then 3 else 5) > 4 > (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_. La construction `let` _sans_ le `in` permet de définir des variables _globales_.
On peut l'utiliser pour définir des fonctions comme suit: 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. ...@@ -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. **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. 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 : 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é ...@@ -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)` ? > 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: 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 ...@@ -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 > utilisera `match` pour distinguer les cas 0, 1 ou 2 bouteilles du cas général
> à _n_ bouteilles. > à _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`: 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 = ...@@ -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_. > É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 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 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. ...@@ -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 > 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 > suivant avec "\n\n". Vérifier que la variable a la bonne valeur en l'affichant
> avec `print_endline chanson_99_bottles;;` . > 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.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment