# AP1 · 3 — Choisir avec des motifs

## Notre question

Comment choisir une action d'après la forme d'une valeur ?

> **Repères.** [Slides 24 à 31](https://ap-2026.noce.fr/slides/AP1-reference.html#24) et [39 à 48](https://ap-2026.noce.fr/slides/AP1-reference.html#39) : pattern matching, clauses, `case`. Poly, chap. 2 « Le pattern matching ». Le [poly](https://ap-2026.noce.fr/poly/poly-elixir.pdf)
> reprend ces notions par écrit.

Cet atelier de réserve est autonome : aucune cellule d'un autre notebook
n'est nécessaire. Le parcours principal de la séance est la série de
carnets `ap1-01-expressions.livemd` à `ap1-05-pile-calculatrice.livemd` ;
utilisez cette fiche pour reprendre une notion ou vous entraîner
davantage, selon les indications données en cours.
Nous utilisons le moteur Elixir de Livebook ; l'installation d'Elixir
sur votre système attendra AP6.

Commencez par prévoir le résultat, puis évaluez les cellules de haut en bas.
Écrivez les fonctions demandées dans la cellule indiquée. Gardez une phrase
sur une hésitation ou une découverte dans votre carnet principal.

> 💡 Pour démarrer : Un motif décrit une forme à reconnaître. Une variable accepte une valeur et lui donne un nom ; une constante exige cette valeur précise. Les clauses d'une fonction sont essayées dans l'ordre.

> 💡 Nous préciserons en cours les ateliers à terminer selon notre rythme.
> Les rubriques « Pour aller plus loin » restent facultatives.
> Vos réponses serviront au bilan, sans exercice supplémentaire à inventer.

Les cellules `assert` sont des vérifications fournies : si une condition
est fausse, Livebook montre le résultat obtenu et celui attendu.
Évaluez cet import une fois, puis réévaluez votre code avant ses tests
après chaque modification.

```elixir
import ExUnit.Assertions
```

## Extraire ce qui nous intéresse (2 min)

Le motif à gauche de `=` doit correspondre à la valeur de droite. Le nom
`amount` capture ici le deuxième élément. Prévoyez le résultat.

```elixir
{:ok, amount} = {:ok, 21}
amount + 2
```

Que se passerait-il avec `{:error, :sold_out}` à droite ? Essayez dans une
cellule séparée. La forme et l'étiquette font partie du contrat : un
échec d'appariement est une information utile, pas une valeur de secours.

## Choisir un tarif (5 min)

Les clauses d'une fonction sont essayées de haut en bas. La première
clause dont les arguments correspondent est retenue.

Nous fournissons le tarif `:full`. Ajoutez une clause `price/1` pour
`:reduced`, qui vaut 5, puis écrivez `total/2` : elle reçoit une catégorie
et une quantité, appelle `price/1` et multiplie le résultat par la quantité.
Tous les appels de cet exercice utilisent l'une de ces deux catégories.

```elixir
defmodule Tariff do
  def price(:full), do: 7
  # Ajoutez l'autre clause de price/1, puis la fonction total/2.
end
```

```elixir
assert Tariff.price(:reduced) == 5
assert Tariff.total(:full, 3) == 21
assert Tariff.total(:reduced, 3) == 15
assert Tariff.total(:full, 0) == 0
```

## Un motif plus général (3 min)

Dans une cellule de texte, indiquez pourquoi une clause
`def price(category), do: 0` placée en premier rendrait les deux tarifs
inaccessibles. Et si nous la placions en dernier ? Quel choix de conception
cela ferait-il pour une catégorie inconnue ?

Pour aller plus loin, écrivez un petit module `Reply` : `label/1` reçoit
`{:ok, name}` et renvoie `"Bonjour " <> name` ; avec `{:error, reason}`,
elle renvoie `"Impossible de répondre"`. Écrivez un test par forme.

## Garder une trace

Sauvegardez ce notebook dans `entrainement/ap1-motifs.livemd`,
en dehors du dossier collecté `AP1/`. Retrouvez la notion suivante dans
`ap1-recursion.livemd` si vous souhaitez poursuivre cet entraînement.
Le parcours principal reste la série `AP1/ap1-01-expressions.livemd`
à `AP1/ap1-05-pile-calculatrice.livemd`, où vous conservez directement
le travail demandé pour le rendu unique du cycle AP1–AP3, le
6 décembre 2026 à 23 h 59 (Paris). Il n'y a pas de deuxième série
de notebooks à rendre.

Un bout de syntaxe oublié ? Les chapitres 1 à 4 du [poly](https://ap-2026.noce.fr/poly/poly-elixir.pdf)
reprennent les formes du langage, chacune avec un exemple et son résultat ;
le cours, lui, se fait dans les carnets.

Pour toute question, vous pouvez me contacter par email :
[aurelien.noce@minesparis.psl.eu](mailto:aurelien.noce@minesparis.psl.eu).
