Bonjour Jonathan,
Ce nouveau code de sform_load me semble bon. J'ai quelques commentaires, cependant:
(* sform_load current elab_context, loc of load, string argument, output type *) ! let sform_load user_elctx loc sargs ot = ! ! let read_file file_name elctx = ! let pres = prelex_file file_name in ! let sxps = lex default_stt pres in ! let nods = sexp_parse_all_to_list (ectx_get_grammar elctx) ! sxps (Some ";") in ! let _, elctx = lexp_p_decls nods elctx ! in elctx in
! let loaded_elctx = match sargs with ! | [String (_,path); ] -> read_file path !_sform_default_ectx ! | _ -> (error loc "argument to load should be one file path (String)"; !_sform_default_ectx) in
SVP utiliser le terme "file name" plutôt que "file path" ici: mieux vaut garder le terme "path" pour une liste de répertoires comme dans $PATH et $LD_LIBRARY_PATH.
! let (_,(user_len,var_map),user_lctx,_) = user_elctx in ! let (_,(_,_),loaded_lctx,_) = loaded_elctx in ! let (_,(def_len,_),def_lctx,_) = !_sform_default_ectx in
SVP utilise ectx_to_lctx plutôt que `(_,_,lctx,_) = ...`.
Ensuite tu peux utiliser M.length sur le lctx pour obtenir user_len et def_len (la présence de ces longueurs dans le ectx est "accidentelle" pour accélérer quelques opérations mais il vaut mieux ne pas en dépendre).
Pour la nouvelle fonction `reset_intra_ref`, j'ai l'impression que c'est aussi qqch qui devrait être fait avec mkSusp, mais je ne suis pas sûr de quoi il s'agit, pourrais-tu m'expliquer que fait cette fonction (e.g. sur un exemple)?
Stefan