Dicas para trabalhar com o Unison localmente através da CLI do Exercism
Escreves código Unison em ficheiros com o sufixo .u. Chamamos-lhes ficheiros "scratch" porque os usas para escrever código Unison, mas é o Unison Codebase Manager (UCM) que, em última análise, armazena e guarda o conteúdo desses ficheiros. Vais continuar a submeter estes ficheiros através da CLI do Exercism, mas podes considerar o UCM a "fonte de verdade" do código Unison.
Embora o Unison não tenha um REPL (Read Evaluate Print Loop), podes avaliar rapidamente expressões Unison em "watch expressions". No teu ficheiro com sufixo .u, começa uma linha com > e escreve uma expressão à direita.
> myFunction 42 "hi"
O UCM mostra o resultado da avaliação da expressão quando guardas o ficheiro. Podes usar isto para diagnosticar problemas nas tuas implementações dos exercícios.
Para um fluxo de trabalho mais aprofundado no Exercism, aqui está um vídeo passo a passo sobre como implementar e testar um problema do Exercism.
O vídeo passo a passo mostra o fluxo de trabalho da versão mais antiga do Unison. Vê o novo fluxo de trabalho aqui com o novo fluxo de trabalho de projeto.
Uma base de código Unison organiza-se por "namespaces". Os namespaces funcionam um pouco como diretórios de um sistema de ficheiros, só que, em vez de conterem ficheiros, contêm os teus tipos e funções Unison. Os caminhos dos namespaces separam-se por pontos, .. Por exemplo, podemos referir-nos ao namespace Text dentro do namespace base com base.Text.
Recomendamos que cries um namespace para cada exercício que estás a resolver, ou que faças cd para ele.
A sintaxe do Unison para gerir 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 âmbito. Isto pode ser útil quando estás a usar uma função como map sobre uma List que precisa de ser distinguida de outras funções map, como Optional.map. Também podes importar funções específicas, escrevendo a seguir ao namespace uma lista de funções separadas por espaços para trazer para o âmbito, como em: use base.data.List tails head flatMap.
Podes usar a sintaxe use tanto ao nível superior de um ficheiro como dentro de funções, para especificar importações. As cláusulas use respeitam as regras do âmbito lexical, por isso as importações mais aninhadas têm precedência sobre as menos aninhadas.
A biblioteca padrão do Unison chama-se base. Por predefinição, é descarregada nas novas bases de código Unison. Podes explorar as funções disponíveis para as tuas implementações através do repositório online de código Unison, Unison share, ou através da interface local da base de código, ou pesquisando no Unison Codebase Manager (UCM). Vamos descrever isso a seguir.
Podes ver a lista completa de comandos do UCM escrevendo help no UCM, mas aqui ficam algumas dicas e convenções.
Podes procurar termos por nome ou por prefixo de namespace no UCM com o comando find, mas o find também suporta pesquisa baseada no tipo numa base de código. Para procurar uma função pela sua assinatura de tipo, escreve find seguido de um espaço e dois pontos, por exemplo find : [a] -> [[a]].
Podes listar o conteúdo de um namespace com o comando ls, por exemplo ls base.data.List ou ls .exercism.helloWorld. Muitos dos comandos do UCM aceitam tanto argumentos de caminho de namespace relativos como argumentos de namespace totalmente qualificados. Os caminhos totalmente qualificados começam com um . que representa a "raiz" da tua base de código.
Navega pelo UCM com o comando cd na CLI. Se um namespace não existir, o cd cria um quando navegas para ele. Para subir num namespace, podes usar cd ...
Quando carrego os testes, o UCM não encontra a minha implementação do exercício.
Certifica-te de que guardas o teu ficheiro stub no editor de texto e de que fazes update dos termos na tua base de código antes de carregar os testes.
Estou a deparar-me com conflitos de nomes. Não posso ter dois termos chamados tests.
Podes ter dois termos com o mesmo nome em namespaces diferentes. Se estás a fazer exercícios do Exercism, recomenda-se que cries um namespace separado para cada exercício, para que os testes e os stubs fiquem separados dos outros.
Os meus testes passam localmente, mas não passam no test runner.
Peço desculpa! Primeiro, verifica se as tuas importações não fazem referência a nada além da biblioteca padrão, base, e das funções definidas no ficheiro scratch em teste. Se for esse o caso, diz-nos no Slack do Exercism, no canal #track-unison, ou abre um issue no repositório da track Unison.
Se tiveres algum problema, diz-nos! 🙂