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.

Le support des appels de fonctions C est fourni par 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.

Exemple :

$ make test
$ ikc3/ikc3
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 :

  def reverse = fn {
    (x) { reverse(x, ()) }
    ([], acc) { acc }
    ([a | b], acc) { reverse(b, [a | acc]) }
  }

par :

  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) :

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

Suivant : Tutoriel KC3