|
| 1 | +# Nix, le language |
| 2 | + |
| 3 | +## References: |
| 4 | + |
| 5 | +https://zero-to-nix.com/concepts/nix-language |
| 6 | + |
| 7 | +## Dans ce chapitre |
| 8 | + |
| 9 | +- Aperçu du langage de programmation Nix |
| 10 | +- Les constructions du langage : littéraux, opérateurs, variables et fonctions |
| 11 | +- Gestion conditionnelle et utilisation des mots-clés `inherit` et `with` |
| 12 | +- Importation et chemins dans Nix |
| 13 | +- Bibliothèques standard de Nix |
| 14 | +- Fonctionnement des dérivations |
| 15 | +- Idiomes courants dans Nix |
| 16 | + |
| 17 | +## Introduction au Langage Nix |
| 18 | + |
| 19 | +Le gestionnaire de paquets Nix repose sur un langage de programmation éponyme. Ce langage est essentiel pour la définition, la construction, et la gestion des paquets ainsi que de leurs dépendances. Nix, le langage, est un langage fonctionnel, purement destiné à la gestion des paquets et des configurations de systèmes. |
| 20 | + |
| 21 | +### Caractéristiques Principales du Langage Nix |
| 22 | + |
| 23 | +Nix est conçu spécifiquement pour répondre aux besoins du gestionnaire de paquets Nix et offre des concepts uniques : |
| 24 | + |
| 25 | +1. **Fonctionnel pur** : Chaque expression Nix est immuable et ne produit pas d'effets de bord. Cela garantit que l'évaluation d'une expression avec les mêmes arguments retournera toujours le même résultat, essentiel pour la reproductibilité des systèmes. |
| 26 | + |
| 27 | +2. **Évaluation paresseuse** : Nix n'évalue les expressions que lorsque leur résultat est explicitement demandé. Cela permet une gestion optimisée des ressources, et une flexibilité accrue pour gérer des configurations complexes. |
| 28 | + |
| 29 | +3. **Spécifique à son domaine** : Contrairement aux langages de programmation généralistes, Nix est entièrement dédié à la gestion des paquets et des environnements de développement. Il n'est pas conçu pour d'autres usages en dehors de ce contexte. |
| 30 | + |
| 31 | +## Constructions du Langage |
| 32 | + |
| 33 | +### Littéraux et Types de Données |
| 34 | + |
| 35 | +Le langage Nix comporte plusieurs types de données, représentés par des littéraux dans le code source. |
| 36 | + |
| 37 | +```nix |
| 38 | +# Exemples de types de données |
| 39 | +42 # Nombre entier |
| 40 | +1.72394 # Nombre flottant |
| 41 | +"hello" # Chaîne de caractères |
| 42 | +./fichier.json # Chemin relatif vers un fichier |
| 43 | +
|
| 44 | +# Listes |
| 45 | +[ 1 2 3 ] |
| 46 | +
|
| 47 | +# Ensembles d'attributs |
| 48 | +{ a = 15; b = "autre chose"; } |
| 49 | +
|
| 50 | +# Ensembles d'attributs récursifs |
| 51 | +rec { a = 15; b = a * 2; } |
| 52 | +``` |
| 53 | + |
| 54 | +### Opérateurs |
| 55 | + |
| 56 | +Nix comprend plusieurs opérateurs communs à de nombreux langages de programmation. Voici quelques exemples : |
| 57 | + |
| 58 | +| Syntaxe | Description | |
| 59 | +|--------------------------|------------------------------------------------| |
| 60 | +| `+`, `-`, `*`, `/` | Opérations numériques | |
| 61 | +| `++` | Concatenation de listes | |
| 62 | +| `==`, `>`, `>=`, `<`, `<=`| Comparateurs d'égalité et d'ordre | |
| 63 | +| `&&`, <code>||</code>| Opérateurs logiques | |
| 64 | +| `!` | Négation logique | |
| 65 | +| `//` | Fusion d'ensembles d'attributs | |
| 66 | + |
| 67 | +#### L'opérateur `//` (Fusion) |
| 68 | + |
| 69 | +L'opérateur `//` est utilisé pour fusionner deux ensembles d'attributs, le second prenant la priorité en cas de conflit. |
| 70 | + |
| 71 | +```nix |
| 72 | +{ a = 1; } // { b = 2; } |
| 73 | +# Résultat : { a = 1; b = 2; } |
| 74 | +
|
| 75 | +{ a = "gauche"; } // { a = "droite"; } |
| 76 | +# Résultat : { a = "droite"; } |
| 77 | +``` |
| 78 | + |
| 79 | +### Liens de Variables |
| 80 | + |
| 81 | +Nix utilise les expressions `let ... in` pour créer des variables locales dans un certain contexte : |
| 82 | + |
| 83 | +```nix |
| 84 | +let |
| 85 | + a = 15; |
| 86 | + b = 2; |
| 87 | +in a * b |
| 88 | +# Résultat : 30 |
| 89 | +``` |
| 90 | + |
| 91 | +Les variables sont immuables, et leurs valeurs ne peuvent être modifiées une fois définies. |
| 92 | + |
| 93 | +### Fonctions |
| 94 | + |
| 95 | +Les fonctions dans Nix sont des lambdas anonymes et prennent un seul argument par défaut (les fonctions à arguments multiples sont simulées par *currying* ou en utilisant des ensembles d'attributs). |
| 96 | + |
| 97 | +```nix |
| 98 | +name: "Bonjour ${name}" |
| 99 | +``` |
| 100 | + |
| 101 | +#### Currying (Fonctions à plusieurs arguments) |
| 102 | + |
| 103 | +Nix utilise le currying pour traiter plusieurs arguments : |
| 104 | + |
| 105 | +```nix |
| 106 | +name: age: "${name} a ${toString age} ans" |
| 107 | +``` |
| 108 | + |
| 109 | +Il est aussi possible d'utiliser des ensembles d'attributs pour accepter plusieurs arguments : |
| 110 | + |
| 111 | +```nix |
| 112 | +{ name, age }: "${name} a ${toString age} ans" |
| 113 | +``` |
| 114 | + |
| 115 | +## Gestion Conditionnelle et Héritage |
| 116 | + |
| 117 | +### `if ... then ... else ...` |
| 118 | + |
| 119 | +Les conditions dans Nix sont des expressions qui nécessitent à la fois une branche "vraie" et "fausse" : |
| 120 | + |
| 121 | +```nix |
| 122 | +if condition |
| 123 | +then "c'est vrai" |
| 124 | +else "c'est faux" |
| 125 | +``` |
| 126 | + |
| 127 | +### Mot-clé `inherit` |
| 128 | + |
| 129 | +Le mot-clé `inherit` permet d'hériter des variables ou des attributs d'un contexte parent : |
| 130 | + |
| 131 | +```nix |
| 132 | +let |
| 133 | + name = "Alice"; |
| 134 | +in { |
| 135 | + inherit name; # Equivalent à name = name; |
| 136 | +} |
| 137 | +``` |
| 138 | + |
| 139 | +### Les blocs `with` |
| 140 | + |
| 141 | +`with` permet d'importer tous les attributs d'un ensemble dans le scope : |
| 142 | + |
| 143 | +```nix |
| 144 | +let attrs = { a = 15; b = 2; }; |
| 145 | +in with attrs; a + b |
| 146 | +# Résultat : 17 |
| 147 | +``` |
| 148 | + |
| 149 | +## Importation et Chemins |
| 150 | + |
| 151 | +Les fichiers Nix peuvent s'importer entre eux avec la fonction `import`. Le système de chemins Nix (`NIX_PATH`) permet d'accéder à des alias de chemins définis globalement. |
| 152 | + |
| 153 | +```nix |
| 154 | +let pkgs = import <nixpkgs> {}; |
| 155 | +in pkgs.hello |
| 156 | +``` |
| 157 | + |
| 158 | +## Bibliothèques Standard |
| 159 | + |
| 160 | +Nix comprend plusieurs bibliothèques standard importantes : |
| 161 | + |
| 162 | +1. **`builtins`** : Contient les fonctions de base du langage, comme `toString`, `fetchGit`, ou `derivation`. |
| 163 | +2. **`pkgs.lib`** : Inclut de nombreuses fonctions utilitaires pour manipuler des listes, ensembles d'attributs, et chaînes. |
| 164 | +3. **`pkgs`** : Représente l'ensemble des paquets disponibles dans Nixpkgs, incluant des fonctions de construction comme `writeText`. |
| 165 | + |
| 166 | +## Les Dérivations |
| 167 | + |
| 168 | +Une dérivation dans Nix décrit une action de construction. C'est un élément fondamental du modèle de gestion des paquets dans Nix. |
| 169 | + |
| 170 | +```nix |
| 171 | +derivation { |
| 172 | + name = "hello"; |
| 173 | + builder = "bash"; |
| 174 | + args = [ "-c" "echo Hello, world!" ]; |
| 175 | +} |
| 176 | +``` |
| 177 | + |
| 178 | +Les dérivations peuvent être générées via des fonctions de plus haut niveau comme `stdenv.mkDerivation`. |
| 179 | + |
| 180 | +## Idiomes de Nix |
| 181 | + |
| 182 | +### Lamba de Fichier |
| 183 | + |
| 184 | +Il est courant d'utiliser une entête de fonction pour passer les dépendances dans les fichiers Nix, afin de permettre une modularité et une flexibilité accrues : |
| 185 | + |
| 186 | +```nix |
| 187 | +{ pkgs ? import <nixpkgs> {} }: |
| 188 | +``` |
| 189 | + |
| 190 | +### `callPackage` |
| 191 | + |
| 192 | +Nixpkgs utilise la fonction `callPackage` pour importer des fichiers avec leurs dépendances, en passant automatiquement les arguments requis : |
| 193 | + |
| 194 | +```nix |
| 195 | +let my-package = pkgs.callPackage ./mon-paquet.nix {}; |
| 196 | +in my-package |
| 197 | +``` |
| 198 | + |
| 199 | +### Overrides et Overlays |
| 200 | + |
| 201 | +Nix permet d'écraser ou de modifier des paquets en utilisant des *overrides* ou des *overlays*, ce qui facilite l'adaptation et l'extension des paquets existants. |
| 202 | + |
| 203 | +```nix |
| 204 | +somePackage.overrideAttrs (old: { |
| 205 | + configureFlags = old.configureFlags or [] ++ ["--nouveau-flag"]; |
| 206 | +}) |
| 207 | +``` |
| 208 | + |
| 209 | +## En Résumé |
| 210 | + |
| 211 | +Le langage Nix, bien que simple, offre une approche puissante et flexible pour la gestion des paquets et des environnements logiciels. Avec ses concepts de pureté fonctionnelle, d'évaluation paresseuse, et d'isolation des dépendances, il permet de construire des systèmes reproductibles, robustes et adaptables. En maîtrisant ses idiomes et constructions, les utilisateurs de Nix peuvent créer et gérer des environnements complexes avec une grande facilité. |
0 commit comments