Dicas para trabalhar com o Unison localmente usando a CLI do Exercism
Você escreve código Unison em arquivos com a extensão .u. Nós os chamamos de arquivos "scratch", porque você os usa para escrever código Unison, mas é o Unison Codebase Manager (UCM) que de fato armazena e salva o conteúdo desses arquivos. Você ainda vai enviar esses arquivos pela CLI do Exercism, mas o UCM pode ser considerado a "fonte da verdade" do código Unison.
Embora o Unison não tenha um REPL (laço de leitura, avaliação e impressão), você pode avaliar expressões Unison rapidamente em "watch expressions". No seu arquivo com extensão .u, comece uma linha com > e escreva uma expressão à direita.
> myFunction 42 "hi"
O UCM mostra o resultado da avaliação da expressão quando você salva o arquivo. Isso pode ser útil para resolver problemas nas suas implementações dos exercícios.
Para um fluxo de trabalho mais completo no Exercism, aqui está um vídeo de passo a passo de como implementar e testar um problema do Exercism.
O vídeo de passo a passo mostra o fluxo de trabalho da versão mais antiga do Unison. Veja o novo fluxo de trabalho aqui com o novo fluxo de trabalho de projeto.
Uma codebase Unison é organizada por "namespaces". Namespaces funcionam um pouco como diretórios em um sistema de arquivos, só que, em vez de conter arquivos, eles contêm seus tipos e funções Unison. Os caminhos de namespace são separados por pontos, .. Por exemplo, podemos nos referir ao namespace Text dentro do namespace base com base.Text.
Recomendamos que você crie um namespace para cada exercício que estiver resolvendo, ou entre nele com cd.
A sintaxe do Unison para gerenciar e especificar importações é a sintaxe use. Por exemplo, use base.data.List traria todas as funções do namespace base.data.List para o escopo. Isso pode ser útil quando você usa uma função como map em uma List que precisa ser diferenciada de outras funções map, como Optional.map. Você também pode importar funções específicas colocando, depois do namespace, uma lista de funções separadas por espaço para trazer ao escopo, como em: use base.data.List tails head flatMap.
Você pode usar a sintaxe use tanto no nível superior de um arquivo quanto dentro de funções para especificar importações. As cláusulas use respeitam as regras de escopo lexical, então importações mais aninhadas têm precedência sobre importações menos aninhadas.
A biblioteca padrão do Unison se chama base. Por padrão, ela é baixada em novas codebases Unison. Você pode explorar as funções disponíveis para as suas implementações no repositório online de código Unison, Unison share, ou pela interface local da codebase, ou ainda buscando no Unison Codebase Manager (UCM). Vamos descrever isso a seguir.
Uma lista completa dos comandos do UCM está disponível ao digitar help no UCM, mas aqui vão algumas dicas e convenções.
Você pode buscar termos por nome ou prefixo de namespace no UCM com o comando find, mas o find também aceita buscas baseadas em tipos em uma codebase. Para buscar uma função pela assinatura de tipo, digite find, um espaço e dois-pontos, por exemplo find : [a] -> [[a]].
Você pode listar o conteúdo de um namespace com o comando ls, por exemplo ls base.data.List ou ls .exercism.helloWorld. Muitos comandos do UCM aceitam tanto argumentos de caminho relativo de namespace quanto argumentos de namespace totalmente qualificados. Caminhos totalmente qualificados começam com um . que representa a "raiz" da sua codebase.
Navegue pelo UCM com o comando cd na CLI. Se um namespace não existir, o cd vai criar um quando você navegar até ele. Para subir um namespace, você pode usar cd ...
Quando eu carrego os testes, o UCM não encontra a minha implementação do exercício.
Certifique-se de salvar o arquivo stub no seu editor de texto e de rodar update nos termos da sua codebase antes de carregar os testes.
Estou esbarrando em conflitos de nomes. Não posso ter dois termos chamados tests.
Você pode ter dois termos com o mesmo nome em namespaces diferentes. Se você está resolvendo exercícios do Exercism, recomendamos criar um namespace separado para cada exercício, para que os testes e os stubs fiquem separados dos demais.
Meus testes passam localmente, mas não passam no executor de testes.
Que pena! Primeiro, verifique se as suas importações não fazem referência a nada além da biblioteca padrão, base, e das funções definidas no arquivo scratch em teste. Se for esse o caso, avise a gente no Slack do Exercism, no canal #track-unison, ou abrindo uma issue no repositório da trilha Unison.
Se você tiver qualquer problema, é só avisar a gente! 🙂