Commit ccd2ad45ab5db7aa505fe19a3a64a65d2ed95e6c

Thomas de Grivel 2025-05-18T15:30:30

doc guides structure of kc3 fr

diff --git a/doc/3_Guides/3.4_Structure.fr.md b/doc/3_Guides/3.4_Structure.fr.md
new file mode 100644
index 0000000..068ee6d
--- /dev/null
+++ b/doc/3_Guides/3.4_Structure.fr.md
@@ -0,0 +1,139 @@
+## Structure
+
+### libkc3
+
+KC3 est implémenté via `libkc3`, une petite bibliothèque C99 qui contient
+le cœur du langage.
+
+La bibliothèque comprend un analyseur syntaxique (parser) et un
+interpréteur pour le code KC3 sous forme de structures C.
+
+Le support des grands entiers est assuré par
+[libtommath](https://github.com/libtom/libtommath).
+
+Le support des appels de fonctions C est fourni par
+[libffi](https://github.com/libffi/libffi).
+
+Les modules sont enregistrés sous forme de bases de faits.
+
+
+#### Analyseur syntaxique (Parser)
+
+L’analyseur est de type "descente récursive".
+
+#### AST
+
+L’AST (arbre de syntaxe abstraite) est représenté sous forme de
+structures de données KC3 et peut être manipulé en méta-programmation
+en C.
+
+#### Interpréteur
+
+Veuillez consulter les fonctions suivantes dans `libkc3/env.c` :
+ - `env_eval_tag` : évalue un tag (n’importe quel type KC3)
+ - `env_eval_block` : évalue un bloc (`do ... end`)
+ - `env_eval_call` : évalue un appel de fonction (`Cfn`, `Fn`)
+ - `env_eval_call_fn_args` : évalue un appel de fonction KC3 (`Fn`)
+
+### ikc3
+
+Shell interactif. Les entrées/sorties terminal sont assurées par
+[linenoise](https://github.com/antirez/linenoise/tree/1.0).
+
+Exemple :
+
+```sh
+$ make test
+$ ikc3/ikc3
+```
+
+```elixir
+ikc3> 1 + 1
+2
+ikc3> 2 + 2
+4
+ikc3> 3 + 3
+6
+ikc3> 1 +
+ikc3> 1
+2
+ikc3> double = fn (x) { x * 2 }
+fn (x) { x * 2 }
+ikc3> double
+fn (x) { x * 2 }
+ikc3> double(1)
+2
+ikc3> double(2)
+4
+ikc3> double(3)
+6
+ikc3> double(4)
+8
+ikc3> List.map([1, 2, 3, 4], double)
+[2, 4, 6, 8]
+ikc3> List.reverse(List.map([1, 2, 3, 4], double))
+[8, 6, 4, 2]
+```
+
+### Chemin des bibliothèques
+
+Les fonctions `List.map` et `List.reverse` sont définies dans  
+`lib/kc3/0.1/list.kc3` et peuvent être modifiées à la volée.
+
+Par exemple, sans quitter `ikc3`, redéfinissez `List.reverse` :
+ouvrez un éditeur et remplacez cette ligne dans `lib/kc3/0.1/list.kc3` :
+
+```elixir
+  def reverse = fn {
+    (x) { reverse(x, ()) }
+    ([], acc) { acc }
+    ([a | b], acc) { reverse(b, [a | acc]) }
+  }
+```
+
+par :
+
+```elixir
+  def reverse = fn {
+    (x) { reverse(x, ()) }
+    ([], acc) { [:reversed | acc] }
+    ([a | b], acc) { reverse(b, [a | acc]) }
+  }
+```
+
+Puis vérifiez le résultat dans `ikc3` (touche flèche haut pour réexécuter) :
+
+```elixir
+ikc3> List.reverse(List.map([1, 2, 3, 4], double))
+[:reversed, 8, 6, 4, 2]
+```
+
+N'oubliez pas de rétablir les modifications dans `list.kc3`.
+
+---
+
+### kc3s
+
+Interpréteur de scripts. Fonctionne comme `ikc3`, mais sans mode interactif  
+et sans affichage des résultats.
+
+---
+
+### HTTPd
+
+Le démon HTTP peut être lancé avec `make test_httpd`.
+
+Il est défini dans `httpd/httpd.c` et `lib/kc3/0.1/httpd.kc3`.
+
+Il agit à la fois comme serveur de fichiers statiques (Web 1.0),
+et comme framework MVC chargeant des fichiers KC3 depuis `./app`.
+
+Le routeur est défini dans `./conf/router.kc3`.
+
+---
+
+Top : [Guides KC3](./)
+
+Précédent : [Guide d'utilisation](3.3_Usage)
+
+Suivant : [Tutoriel KC3](3.5_Tutorial)