Je me souviens plus pourquoi que l'on voulait utiliser une liste de Meyers ?
Pour que l'accès aux variables dans l'environnement soit O(log N) au lieu de O(N).
Il me semblait que l'on avait dit que
let a = b, c = d in
devient
let a = b in let c = d in
Nous n'avons donc pas besoin que Lexp.Let(location * (vdef * lexp * ltype) list * lexp) et nous pouvons utiliser location Lexp.Let(location * (vdef * lexp * ltype)
- lexp) à la place.
Non, parce qu'il y a aussi le cas
let odd : int -> int; even : int -> int; odd n = case n | 0 => false | S n' => even (n'); even n = case n | 0 => true | S n' => odd (n'); in <exp>
qui ne peut pas se décomposer.
Je vais créer un type temporaire Lexp.UnknownType(loc) pour remplacer les types qui ne sont pas encore inféré
OK. Sinon tu peux aussi simplement utiliser type_int.
Est-ce bien un exemple correcte d'un let dans typer ?
let a::Nat, a = b in
Presque. L'annotation de type utilise ":" plutôt que "::" et le séparateur entre déclarations est ";" plutôt que ",".
Stefan
Afficher les réponses par date
Bonjour
Je n'ai pas utilisé la liste de meyers, mais une Map (entre le nom de la variable et son index), quand une variable est ajouté tous les index augmentent de 1. Lorsque nous entrons dans un nouveau scope une nouvelle map est créée (inner scope) (Elle a aussi accès à la map extérieur (outer scope)). Je pense aussi utiliser cette structure pour détecter les récursions. (Si la variable est trouvé dans le 'inner' scope alors nous sommes en présence d'une récursion.
Je pense qu'une Map est possiblement plus couteuse qu'une liste de meyers. Dans le pire des cas, j'ai définis une interface pour la gestion des index dans le fichier debruijn.ml, ainsi la modification de la structure de donnée devrait se faire relativement sans douleur.
Je viens de voir votre commit. Je vais le regarder plus en détail aujourd'hui.
[ SVP, envoyer à typer@iro comme ça Vincent les voit aussi. ]
Je n'ai pas utilisé la liste de meyers, mais une Map (entre le nom de la variable et son index),
Oui, je n'avais pas été très clair. Il nous faut les deux: - une SMap qui traduit les noms en index de debruijn. - un "Myers list" qui donne l'info associée à un index de debruijn.
Dans le code antérieur, on en utilisait aussi deux: - une SMap qui traduit les noms en "unique small integer". - une Map qui donne l'info associée à un unique small integer.
scope)). Je pense aussi utiliser cette structure pour détecter les récursions. (Si la variable est trouvé dans le 'inner' scope alors nous sommes en présence d'une récursion.
Non. Cela détecte quand une variable en cache une autre, ce qui peut arriver de manière tout à fait normale, mais n'introduit pas de récursion.
Je viens de voir votre commit. Je vais le regarder plus en détail aujourd'hui.
Tu devrais avoir reçu un courriel contenant le diff de ce commit quand je l'ai installé (i.e. ça fait déj`a pas mal de temps). L'as-tu reçu?
Stefan
j'avais bien reçu l'email mais il avait été placé dans le boite à spam. Il semble que gmail n'arrive pas à authentifier l'adresse email de gitlab et le classifie donc comme malicieux.
J'ai push mes modifications. full_debug.ml compile c'est ce que j'utilise pour tester l'implémentation de nouvelles fonctionnalité.
Exemple d'output:
==== Node Sexp ======================= Symbol: [ln 1, cl 1] ab Node: [ln 4, cl 39] lambda_=>_ (_:_ a Type) @ (lambda_ (_:_ x (_->_ a x))) @ Node: [ln 7, cl 13] _->_ p:int @ int @
Pexp ======================= Pvar [ln 1, cl 1] ab Plambda [ln 4, cl 9] (lambda_=>_ (_:_ a Type) ?_) Parrow [ln 7, cl 13] (_->_ p:int int)
==== Lexp ======================= Var [ln 1, cl 1] ab Lambda [ln 4, cl 9] lambda (a: Type) -> unkwn Arrow [ln 7, cl 13] p:int -> int
On Feb 25, 2016, at 1:08 PM, Stefan Monnier monnier@iro.umontreal.ca wrote:
[ SVP, envoyer à typer@iro comme ça Vincent les voit aussi. ]
Merci, car même au Mexique je lisais mes emails de Typer ;-)
Vincent