Salut,
Je terminais mes changements aux messages dans Typer et mes branches commencent à devenir assez spaghetti. J'aimerais merger quelques changements qui sont prêts, mais d'abord, voici un petit rappel de ce que j'essaie d'accomplir.
- Séparer le module `Log` en deux, `Trace` et `Diagnostics`. - `Trace` est destiné pour le développement de Typer lui-même. Les messages sont mis en contexte par rapport au code OCaml. Il sont contrôlé par section et par des variables d'environnement. Par exemple `TYPER_TRACE="DEBRUIJN=debug"` va activer les messages au niveau `debug` et supérieur. L'amélioration par rapport à la situation actuelle est qu'on évite le "fire hose" en n'activant pas *tous* les messages. De plus, les messages sont imprimés immédiatement en cas d'un crash. - `Diagnostic` est pour le développement du code Typer. Les messages sont en contexte du code Typer lui-même. C'est les messages habituels d'un compilateur, automatiquement activés.
Voici ce qui est prêt.
- J'ai étendu la `location` des `Node`s à tous ses éléments plutôt qu'à seulement la tête. Cela permet d'afficher par exemple les arguments d'un appel qui ne type-check pas.
https://gitlab.com/monnier/typer/-/compare/main...simon--sexp-node-location
- J'ai retravaillé l'impression de sexp, lexp, elexp, etc pour utiliser le module `Format`. L'objectif de ce changement est d'éviter que des appels au système de traçage ne dégrade la performance. Par exemple, prenons ce message.
Log.debug "ma lexp: %s\n" (lexp_string e)
Ça a le bon comportement, mais converti inutilement en texte la `lexp` `e` si le niveau `debug` n'est pas activé. Il existe un spécificateur `%a`, qui permet de passer une fonction de formatage, qui ne sera appelée que si l'impression a lieu.
Log.debug "ma lexp: %a\n" lexp_print e
Ce spécificateur est supporté par deux des modules de formatage de la bibliothèque standard, soit `Printf` et `Format`. J'ai choisi d'utiliser `Format` pour quelques raisons, en particulier le fait qu'il supporte des directives pour le pretty-printing. De plus Printf a le défaut que le type des fonctions de formattage dépend de la destination. Par exemple, `Trace.warn`, qui imprime directement sur stdout, et `Diagnostics.warn` qui imprime vers un string qui est gardé dans un log demandent deux versions différente de `lexp_print`.
https://gitlab.com/monnier/typer/-/compare/main...simon--pp-print
J'ai aussi déplacé la plupart des fonctionnalités de `debug_utils` dans `typer` lui-même, maintenant qu'on a des sous commandes.
- J'ai modifié la façon dont les fichiers sources sont traités.
https://gitlab.com/monnier/typer/-/compare/simon--sexp-node-location...simon...
En ce moment, si la source est un fichier, elle est lue ligne par ligne. Je propose de plutôt lire le fichier d'un coup. Cela a l'avantage de simplifier le code en gérant les fichier et les string entrées dans le REPL de la même façon. Surtout, on conserve la source pour pouvoir imprimer le code de l'utilisateur avec les messages d'erreur. Plus besoin de deviner d'où vient une lexp.
Désolé pour la taille des patch, mais il y a des messages dans presque tous les fichiers je fini par changer beaucoup de lignes. Par contre, je n'ai touché à rien d'essentiel pour le fonctionnement de Typer le langage.
Bonne soirée Simon