Module Id.Scoped

Ce module utilitaire fournit un type dont les éléments sont des valeurs chacune munie d'un identifiant distingué. Il peut être utile pour représenter des objets syntaxiques dans laquelle la variable distinguée doit être considérée comme liée.

type nonrec 'a t = {
  1. bound : t;
  2. inscope : 'a;
}

Une valeur de type 'a t associe une valeur de type 'a et un identifiant distingué.

Un usage fréquent est celui où 'a est un type représentant des arbres de syntaxe, et la valeur v de type 'a t représente un arbre de syntaxe où la variable distinguée est liée dans

auquel cas

val pp : (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a t -> unit

Ce type est affichable.

val map : ('a -> 'b) -> 'a t -> 'b t

On peut appliquer une fonction à la valeur sous-jacente et préserver la variable distinguée.

val fold : ('a -> 'b) -> 'a t -> 'b

On peut appliquer une fonction à la valeur sous-jacente en oubliant la variable distinguée.

val enter : ('a Env.t -> 'b -> 'c) -> 'a Env.t -> 'b t -> 'a -> 'c

enter f env scoped v s'évalue vers le résultat de f appliqué à env' et scoped.body où env' désigne l'environnement env étendu avec la liaison de scoped.bound à v.

val app : ('a -> 'b) t -> 'a -> 'b t

app s x applique la fonction à portée dans s à x, en conservant la variable liée ; autrement dit, app s x est map (fun f -> f x) s.