Edit

kc3-lang/kc3/doc/3_Guides/3.4_Structure.fr.md

Branch :

  • doc/3_Guides/3.4_Structure.fr.md
  • ## Guide de la structure de KC3
    
    ### 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)