Salut Laurent,
Laurent Huberdeau pushed new branch laurent/elab_cache at Stefan / Typer
Oops, désolé, j'ai laissé passer ce courriel sous mon radar!
Je viens de jeter un coup d'œil à cette branche. Voici mes commentaires à chaud:
- src/serialization_types: SVP ajoute une extension à ce nom de fichier pour qu'on puisse plus facilement y associer un `major-mode`. Pourrait-on le générer automatiquement à partir du code OCaml, ou l'inverse (histoire d'éviter cette duplication)?
Peut-être qu'une autre option est de demander à ATD de créer non pas des types similaires aux nôtres, mais plutôt un "universal type" (un peu comme Sexp) qui couvre nos besoin. Ça augmenterait un peu la complexité de `serialization.ml`, mais simplifierait `serialization_types`.
- src/serialization.ml:
- tu dépasses beaucoup les 80 colonnes. SVP évite-ça autant que possible.
- LexpMap: on a déjà une table de hashage dans lexp.ml. Tu ne peux pas vraiment la réutiliser paske c'est une table qui ne fait que du hash-consing (tu ne peux pas en extraire un index pour chaque objet), mais elle vient avec un commentaire "relevant":
module WHC = Weak.Make (struct type t = lexp (* Using (=) instead of `compare` results * in an *enormous* slowdown. Apparently * `compare` checks == before recursing * but (=) doesn't? *) let equal x y = (compare x y = 0) let hash = Hashtbl.hash
- serialize_lexp: - si je comprends bien, tu numérotes les nœuds en "preorder" alors qu'il serait préférable de le faire en "postorder". - il semble que chaque branche se termine par `addToCtx`, donc il serait préférable d'avoir un seul appel à la fin plutôt qu'un appel dans chaque branche (forme de CSE).
- deserialize_lexp: - évite l'identifiant `ref` pour une variable. - je ne comprends pas à quoi sert la table de hachage. - je ne comprends pas pourquoi on a
List.assoc_opt ref store.lexp_refs
ça ressemble à une opération de complexité O(N) pour chacun des N nœuds, pour un total de O(N²). Me trompe-je?
- "cache": en fait, je pensais plutôt rendre ces fichiers explicites, pensés plus comme "la version compilée" du fichier, genre `foo.o` ou `foo.cmo`. Je te laisse choisir l'extension (qui ne devrait être ni `.o` ni `.cmo`).
-- Stefan