Lib.ClosedCe module définit la syntaxe abstraite du langage intermédiaire (type t) ainsi que divers types et fonctions auxiliaires.
La sémantique du langage est définie par le sous-module Eval.
À la différence du langage Skimmel, ce langage Closed ne dispose plus de fonctions anonymes : les fonctions doivent être définies à la surface (top-level) du programme, et ne peuvent être imbriquées. Le corps de ces fonctions ne peuvent donc faire référence qu'à d'autres fonctions définies précédemment.
Une autre différence est la présence de constructions permettant la manipulation de blocs. Un bloc est essentiellement une séquence contiguë de taille fixe découpée en cellules contenant des valeurs arbitraires. Vous pouvez y penser comme à des tableaux hétérogènes (au sens où les cellules peuvent stocker des valeurs de types distincts). Les blocs existent comme des objets modifiables en mémoire, voir le module Eval pour une sémantique de référence qui rend cette idée précise.
type exp = | Var of Id.tUne occurrence de variable.
*)| Lit of intUne constante littérale.
*)| Builtin of Builtin.t * exp listUne application d'opérateur prédéfini avec ses arguments.
*)| App of exp * expUne application avec ses arguments.
*)| Let of exp * exp Id.Scoped.tUne définition de variable locale.
*)| Seq of exp * expUne séquence.
*)| If of exp * exp * expUne expression conditionnelle.
*)| Pair of exp * expUne paire.
*)| Proj of bool * expUne projection.
*)| Allocate of expUne allocation de bloc. La taille du bloc est donnée par la valeur de la sous-expression. Les valeurs initiales des cellules sont indéfinies.
*)| Read of exp * expUne lecture d'un bloc donné par la première sous-expression à un indice donné par la seconde sous-expression.
Lire une cellule dans laquelle on n'a jamais écrite fournit un résultat non spécifié.
*)| Write of exp * exp * expUne écriture de bloc à un indice fixé, la troisième sous-expression fournissant la valeur à écrire. Cette expression s'évalue vers un entier non spécifié (en plus de modifier le bloc en mémoire).
*)Le type des expressions, quasiment identique au type Skimmel.t à l'exception de l'absence de fonctions anonymes.
val pp_exp : Format.formatter -> exp -> unitLes expressions sont affichables.
type fundef = {name : Id.t;Le nom de la fonction.
*)is_rec : bool;La fonction est-elle récursive ?
*)params : Id.t list;La liste des paramètres de la fonction.
*)body : exp;Le corps de la fonction.
*)}Le type des définitions de fonctions.
val pp_fundef : Format.formatter -> fundef -> unitLes définitions de fonction sont affichables.
type t = {defs : fundef list;Les fonctions définies à top-level.
*)body : exp;L'expression principale qui détermine le résultat du programme.
*)}Un programme du langage implémenté par le présent module comprend une liste de définitions de fonctions données à top-level ainsi qu'une expression principale.
val pp : Format.formatter -> t -> unitLes programmes sont affichables.