diff --git a/README.md b/README.md
index e730bad1e164a2c0a80b9f33d1f03d60b3edcf86..c141b28bf35866ba9fe20f53b9f55bcd1abf4d57 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 | ----- | ------------- | ---- | -------------------------------------------------------------------- |
 | 16/01 | 8h            | CM   | [Diapositives](cm/lifpf-cm1.pdf)                                     |
 |       | 9h45          | TD   | [Sujet](td/lifpf-td1-enonce.pdf) <br> Groupes B et E à 11h30         |
-| 23/01 | 8h            | CM   | Diapositives à venir                                                 |
+| 23/01 | 8h            | CM   | [Diapositives](cm/lifpf-cm2.pdf), [Script démos](cm/cm2-demo.md)     |
 |       | 9h45 ou 11h30 | TP   |  [Sujet](tp/tp1.md) <br> Groupe de TP, horaire et salle sur [tomuss] |
 
 [tomuss]: https://tomuss.univ-lyon1.fr
diff --git a/cm/cm2-demo.md b/cm/cm2-demo.md
new file mode 100644
index 0000000000000000000000000000000000000000..7e35c8e1e5a48d2b4ab6e3e31e03fa424cee3687
--- /dev/null
+++ b/cm/cm2-demo.md
@@ -0,0 +1,244 @@
+## Variables
+
+```ocaml
+
+let x_g = 3;;
+
+let x = 2 in 3 + x * x;;
+
+let x = 5 in
+let y = x + 2 in
+x * y;;
+
+let x =
+    let y = 3
+    in y * y
+in x + 10;;
+
+```
+
+## Appels de fonction
+
+```ocaml
+not false;;
+
+log 10.0;;
+
+abs (int_of_string "-3");;
+
+hypot 3.0 4.0;;
+
+hypot (2.5 +. 0.5) (2.0 *. 2.0);;
+
+hypot 2.0 1.5 *. 2.0 ;;
+
+hypot 2.0 (1.5 *. 2.0) ;;
+```
+
+## Définitions de fonction
+
+```ocaml
+let carre (x:int): int = x * x;;
+
+let carre2 x = x * x;;
+
+let cube x = x * x * x
+in cube 2;;
+
+let cube (x:int): int =
+    let carre3 y = y * y
+    in carre3 x * x;;
+cube 4;;
+carre3;;
+```
+
+## Énumérations
+
+```ocaml
+type jour =
+   | Lundi
+   | Mardi
+   | Mercredi
+   | Jeudi
+   | Vendredi
+   | Samedi
+   | Dimanche
+;;
+
+Lundi;;
+
+Mercredi;;
+
+Lundi = Mercredi;;
+
+Lundi < Mercredi;;
+
+```
+
+## Filtrage
+
+```ocaml
+match Lundi with
+| Mardi -> 2
+| Mercredi -> 3
+| Lundi -> 1
+| Vendredi -> 5
+| Dimanche -> 7
+| Samedi -> 6
+| Jeudi -> 4
+;;
+
+match Lundi with
+| Mardi -> 2
+| Mercredi -> 3
+| Lundi -> 1
+| Vendredi -> 5
+| Dimanche -> 7
+| Samedi -> 6
+(* | Jeudi -> 4 *)
+;;
+
+let weekend (j: jour): bool =
+    match j with
+    | Samedi -> true
+    | Dimanche -> true
+    | autre -> false
+;;
+
+let weekend (j: jour): bool =
+    match j with
+    | Samedi -> true
+    | Dimanche -> true
+    | _ -> false
+;;
+```
+
+## Nuplet
+
+```ocaml
+match (3.5, "coucou") with
+| (_, s) -> s^" tout le monde"
+;;
+```
+
+## Filtrage sur types de base
+
+```ocaml
+let is_zero (n: int): bool =
+match n with
+| 0 -> true
+| _ -> false
+;;
+
+is_zero 1;;
+
+is_zero 0;;
+```
+
+## Types sommes avec données
+
+```ocaml
+type nombre =
+  | Int of int
+  | Float of float
+  | Cplx of float * float
+  | Nan
+;;
+
+Int 3;;
+
+Cplx (3.0, 7.2);;
+
+let int_of_nombre (n: nombre): int =
+    match n with
+    | Int i -> i
+    | Float f -> int_of_float f
+    | Cplx (r,_) -> int_of_float r
+    | Nan -> 0
+;;
+
+int_of_nombre (Cplx (3.0, 7.2));;
+```
+
+## Pattern matching en profondeur
+
+```ocaml
+let is_zero (n: nombre): bool =
+    match n with
+    | Int 0 -> true
+    | Float 0.0 -> true
+    | Cplx (0.0, 0.0) -> true
+    | _ -> false
+;;
+```
+
+## Rappel récursivité
+
+```ocaml
+(**
+Fonction qui calcule la somme des carrés des n premiers entiers
+@param n le nombre d'entiers
+@return la somme
+*)
+let rec somme_carres (n: int): int =
+    if n <= 0
+    then 0
+    else n * n +  somme_carres (n-1);;
+```
+
+## Listes
+
+```ocaml
+let l1 = 1 :: 3 :: 5 ::[] ;;
+let l2 = [ 1; 3; 5 ];;
+l1 = l2;;
+
+type resultat = Aucun | Int of int;;
+
+(**
+Cette fonction donne le maximum d'un liste d'int
+@param l la liste dont on veut le max
+@return le max ou Aucun si la liste est vide
+*)
+let rec maximum (l: int list): resultat =
+    match l with
+    | [] -> Aucun
+    | x :: [] -> Int x
+    | x :: l2 ->
+        match maximum l2 with
+        | Aucun -> Int x
+        | Int y -> if x > y
+                   then Int x
+                   else Int y
+;;
+
+maximum [ 2; 1; 5; 3 ];;
+maximum [ 2 ];;
+maximum [];;
+
+(**
+Calcule le maximum dans une liste de liste d'int
+@param ll la liste de liste
+@return le max ou Aucun s'il n'y a pas d'int dans ll
+*)
+let rec maximum2 (ll: int list list): resultat =
+    match ll with
+    | [] -> Aucun
+    | l :: [] -> maximum l
+    | l :: ll2 ->
+        let ml = maximum l in
+        let mll2 = maximum2 ll2 in
+        match ml, mll2 with
+        | Aucun, m -> m
+        | m, Aucun -> m
+        | Int m1, Int m2 ->
+            if m1 < m2
+            then Int m2
+            else Int m1
+;;
+
+maximum2 [ [2; 3]; [4; 1]; [1; 6; 8]];;
+maximum2 [ []; [1]; [0; 0]];;
+maximum2 [ []; [] ];;
+maximum2 [];;
+```
diff --git a/cm/lifpf-cm2.pdf b/cm/lifpf-cm2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..7766701dcb981084579a5150243928257a3c02c4
Binary files /dev/null and b/cm/lifpf-cm2.pdf differ