Des astuces pour travailler avec Unison en local via l'Exercism CLI.
Tu écris du code Unison dans des fichiers dont le suffixe est .u. On les appelle des fichiers scratch parce que tu les utilises pour écrire du code Unison, mais c'est le Unison Codebase Manager (UCM) qui stocke et enregistre en fin de compte le contenu de ces fichiers. Tu continueras à soumettre ces fichiers via l'Exercism CLI, mais on peut considérer l'UCM comme la « source de vérité » du code Unison.
Bien qu'Unison n'ait pas de REPL (Read Evaluate Print Loop), tu peux évaluer rapidement des expressions Unison dans des watch expressions. Dans ton fichier avec le suffixe .u, commence une ligne par > et saisis une expression à droite.
> myFunction 42 "hi"
L'UCM affiche le résultat de l'évaluation de l'expression dès que tu enregistres le fichier. Ça peut servir à dépanner tes implémentations d'exercices.
Pour un workflow Exercism plus approfondi, voici une vidéo de démonstration qui montre comment implémenter et tester un problème Exercism.
La vidéo de démonstration montre le workflow de l'ancienne version d'Unison. Pour le nouveau workflow, consulte cette page, qui décrit le nouveau workflow de projet.
Une base de code Unison s'organise en namespaces. Les namespaces fonctionnent un peu comme des répertoires dans un système de fichiers, sauf qu'au lieu de contenir des fichiers, ils contiennent tes types et tes fonctions Unison. Les chemins de namespaces sont séparés par des points, .. Par exemple, on peut désigner le namespace Text du namespace base par base.Text.
On te recommande de créer un namespace pour chaque exercice que tu fais, ou d'y faire un cd.
La syntaxe d'Unison pour gérer et spécifier les imports est la syntaxe use. Par exemple, use base.data.List fait entrer dans la portée toutes les fonctions du namespace base.data.List. C'est utile quand tu utilises une fonction comme map sur une List et qu'il faut la distinguer d'autres fonctions map comme Optional.map. Tu peux aussi importer des fonctions précises en faisant suivre le namespace d'une liste de fonctions séparées par des espaces, comme dans : use base.data.List tails head flatMap.
Tu peux utiliser la syntaxe use aussi bien au niveau supérieur d'un fichier qu'à l'intérieur de fonctions pour spécifier des imports. Les clauses use respectent les règles de portée lexicale, donc les imports les plus imbriqués sont prioritaires sur les moins imbriqués.
La bibliothèque standard d'Unison s'appelle base. Par défaut, elle est téléchargée dans les nouvelles bases de code Unison. Tu peux parcourir les fonctions disponibles pour tes implémentations via le dépôt en ligne de code Unison, Unison share, ou via l'interface locale de la base de code, ou encore en effectuant une recherche dans le Unison Codebase Manager (UCM). On verra ça juste après.
Pour obtenir la liste complète des commandes de l'UCM, saisis help dans l'UCM. En voici quelques astuces et conventions.
Tu peux rechercher des termes par nom ou par préfixe de namespace dans l'UCM avec la commande find, mais find prend aussi en charge la recherche par type dans une base de code. Pour rechercher une fonction par sa signature de type, saisis find suivi d'un espace et d'un deux-points, par exemple find : [a] -> [[a]].
Tu peux lister le contenu d'un namespace avec la commande ls, par exemple ls base.data.List ou ls .exercism.helloWorld. Beaucoup de commandes de l'UCM acceptent aussi bien des chemins de namespace relatifs que des chemins de namespace complets. Les chemins complets commencent par un . qui représente la « racine » de ta base de code.
Déplace-toi dans l'UCM avec la commande cd dans la CLI. Si un namespace n'existe pas, cd en crée un quand tu y vas. Pour remonter d'un niveau dans les namespaces, tu peux utiliser cd ...
Quand je charge les tests, l'UCM ne trouve pas mon implémentation de l'exercice.
Vérifie que tu enregistres bien ton fichier stub dans ton éditeur de texte et que tu fais update des termes de ta base de code avant de charger les tests.
Je rencontre des conflits de noms. Je ne peux pas avoir deux termes appelés tests.
Tu peux avoir deux termes du même nom dans des namespaces différents. Si tu fais des exercices Exercism, il est recommandé de créer un namespace distinct pour chaque exercice, afin que les tests et les stubs soient séparés des autres.
Mes tests passent en local, mais pas sur l'exécuteur de tests.
Désolé ! Vérifie d'abord que tes imports ne font référence à rien d'autre qu'à la bibliothèque standard, base, et aux fonctions définies dans le fichier scratch testé. Si c'est le cas, n'hésite pas à nous le signaler sur le Slack Exercism, dans le canal #track-unison, ou en ouvrant une issue sur le dépôt du parcours Unison.
Si tu rencontres le moindre problème, n'hésite pas à nous le dire ! 🙂