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.
L’analyseur est de type "descente récursive".
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.
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
)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]
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
.
Interpréteur de scripts. Fonctionne comme ikc3
, mais sans mode interactif
et sans affichage des résultats.
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