# AP1 · 2 — Écrire une petite fonction

## Notre question

Comment décrire un calcul une seule fois et lui donner des valeurs différentes ?

> **Repères.** [Slides 32 à 43](https://ap-2026.noce.fr/slides/AP1-reference.html#32) : fonctions et modules. Poly, chap. 4 « Fonctions, clauses, récursion ». 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 : `Module.function/2` désigne une fonction à deux arguments. Les paramètres sont les noms utilisés dans sa définition ; les arguments sont les valeurs fournies à chaque appel. La dernière expression est le résultat.

> 💡 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
```

## Lire une définition (2 min)

Le module regroupe des fonctions. Les arguments sont les données de chaque
appel ; la dernière expression de la fonction fournit le résultat.
Prévoyez le résultat, puis essayez un autre prénom.

```elixir
defmodule Greeting do
  def hello(name) do
    "Bonjour " <> name
  end
end

Greeting.hello("Ada")
```

## Écrire une fonction complète (5 min)

Écrivez `Tickets.total/2` dans le module ci-dessous. Elle reçoit un prix
unitaire et une quantité entière positive ou nulle, puis renvoie leur
produit. Le suffixe `/2` veut dire « deux arguments ». Vous choisissez les
noms des paramètres ; il n'y a ni affichage ni `return` à ajouter.

Contrat : `Tickets.total(7, 3)` vaut `21`, et `Tickets.total(5, 0)` vaut `0`.
Servez-vous de la définition de `hello/1` pour retrouver la syntaxe.

```elixir
defmodule Tickets do
  # Écrivez ici la définition complète de total/2.
end
```

```elixir
assert Tickets.total(7, 3) == 21
assert Tickets.total(5, 0) == 0
assert Tickets.total(2.5, 4) == 10.0
```

## Suivre les données (3 min)

Dessinez sur une ligne les arguments de `Tickets.total(5, 3)`, les valeurs
des paramètres pendant cet appel et le résultat. D'où vient le `5` ?
Exécutez ensuite les deux appels ci-dessous. Le premier change-t-il le
comportement du second ? Expliquez votre réponse dans cette cellule.

```elixir
{Tickets.total(5, 3), Tickets.total(7, 3)}
```

Pour aller plus loin, ajoutez `with_fee/3` au même module : elle appelle
`total/2`, puis ajoute des frais fixes. Par ex. `Tickets.with_fee(7, 3, 2)`
vaut `23`. Écrivez une assertion sur une commande de quantité nulle.

## Garder une trace

Sauvegardez ce notebook dans `entrainement/ap1-fonctions.livemd`,
en dehors du dossier collecté `AP1/`. Retrouvez la notion suivante dans
`ap1-motifs.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).
