Lib.SkimmelCe module définit la syntaxe abstraite du langage source (type t) ainsi que divers types et fonctions auxiliaires.
La sémantique du langage est définie par le sous-module Eval.
type t = | Var of Id.tUne (occurrence de) variable.
*)| Lit of intUne constante littérale.
*)| Builtin of Builtin.tUn opérateur prédéfini.
*)| Fun of t Id.Scoped.tUne fonction anonyme.
Le paramètre formel de la fonction est géré via le type Id.Scoped.t.
Par exemple, la valeur Fun Id.Scoped.{ bound = "x"; inscope = Var "x"; } représente l'arbre de syntaxe de la fonction écrite fun x -> x dans la syntaxe concrète.
| RecFun of t Id.Scoped.t Id.Scoped.t| App of t * tUne application de fonction.
*)| Let of t * t Id.Scoped.tUne définition locale.
*)| Seq of t * tUne séquence e1 ; e2. La valeur de l'expression gauche est ignorée, le résultat est celui de l'expression droite.
*)| If of t * t * tUne expression conditionnelle.
*)| Pair of t * tUne paire.
*)| Proj of bool * tUne projection hors d'une paire : si e est une expression Skimmel qui s'évalue vers une paire Pair (v1, v2), alors l'expression Proj (false, e) (respectivement Proj (true, e)) s'évalue vers v1 (respectivement v2).
Le type des expressions de Skimmel, notre langage source.
val pp : Format.formatter -> t -> unitLes arbres de syntaxe sont affichables.
gather_args e renvoie une paire (e', args) telle que e est l'application de e' à la liste d'arguments args.
Par exemple, si e est de la forme App (App (e1, e2), e3) alors gather_args e renvoie (e1, [e2; e3]).
Si args est vide, alors e par définition n'était pas une application.