Est-ce que le bug pourrait venir de la fonction `env_lookup_type` ?
let env_lookup_type ctx (v : vref): lexp = let (_, idx) = v in let (r, _, _, ltp) = _env_lookup ctx v in (L.push_susp ltp (S.shift (idx - 0 + 0)))
J'ai essayé plusieurs indices et j'ai repéré quelque chose d'étrange lorsque je fais un shift de idx, j’obtiens Macro[20] mais lorsque je fais un shift de idx + 1 j’obtiens Macro[22].
Voici une liste de tests qui montre le comportement du shift.
Shift: idx macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[20] (= inductive-cons Macro[21] Macro_)
Shift: idx + 1 macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[22] (= float_)
Shift: idx + 2 macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[24] (= node_)
Shift: idx - 1 macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[18] (= sexp_dispatch_)
Afficher les réponses par date
Est-ce que le bug pourrait venir de la fonction `env_lookup_type` ?
C'est possible.
let env_lookup_type ctx (v : vref): lexp = let (_, idx) = v in let (r, _, _, ltp) = _env_lookup ctx v in (L.push_susp ltp (S.shift (idx - 0 + 0)))
Hmm... si idx est 0, il faudrait faire un shift de 1 (parce que le type de la dernière variable peut référer à toutes les autres sauf elle-même), donc la réponse correcte devrait être (S.shift (idx + 1)).
J'ai essayé plusieurs indices et j'ai repéré quelque chose d'étrange lorsque je fais un shift de idx, j’obtiens Macro[20] mais lorsque je fais un shift de idx + 1 j’obtiens Macro[22].
C'est effectivement très curieux.
Voici une liste de tests qui montre le comportement du shift.
Shift: idx macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[20] (= inductive-cons Macro[21] Macro_)
Shift: idx + 1 macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[22] (= float_)
Shift: idx + 2 macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[24] (= node_)
Shift: idx - 1 macro_type=inductive_ (Macro) (Macro_ (List[33] Sexp[47]) -> Sexp[47]) ltp=Macro[18] (= sexp_dispatch_)
Hmm... ça semble pointer vers une erreur dans la gestion des substitutions.
Stefan
Salut Pierre,
Comme tu l'as peut-être vu, j'ai installé plusieurs changements qui ont corrigés divers petites imprécisions vis-à-vis des contextes (i.e. "scoping") qui causaient toutes sortes d'erreurs de "db_index".
Ça m'étonnerait pas qu'il en reste, mais pour l'instant les tests bloquent sur autre chose (des boucles sans fin, une avant add-attribute, et une avant macro-decls). Pourrais-tu y jeter un coup d'œil, voir si tu trouves le(s) problème(s) qui causent ces boucles sans fin?
Stefan
Bonjour,
Je viens de regarder et il me semble que la partie qui créée une boucle sans fin est la comparaison entre deux contextes `if nctx = nctx' then` dans le code de `lexp_decls_1` branche Pmcall.
`lexp_decls_macro ` retourne de façon correcte mais aucune branche n'est sélectionné par la suite. De plus, `lexp_decls_1` n'ai pas exécuté une seconde fois.
Je viens de regarder et il me semble que la partie qui créée une boucle sans fin est la comparaison entre deux contextes `if nctx = nctx' then` dans le code de `lexp_decls_1` branche Pmcall.
Ah. bonne idée. Il faut utiliser le == à la place.
En effet, ça va mieux maintenant. Donc, c'était probablement pas une inf-loop, juste une preuve que le `=` structurel de OCaml est pas efficace (que je sache, les ctx n'ont pas de cycles, par contre avec les double liens des Myers lists, si `=` ne prête pas attention au partage il prend un temps O(2^N) pour comparer des Myers listes de longueur O(N)).
Stefan
PS: C'est probablement plus du côté de O(1.5^N), mais le problème reste le même.