Lavorare dalla riga di comando

Consigli per lavorare con Unison in locale tramite la CLI di Exercism


Scrivere e valutare codice Unison

Scrivi il codice Unison in file con il suffisso .u. Li chiamiamo file «scratch» perché li usi per scrivere codice Unison, ma è l'Unison Codebase Manager (UCM) che alla fine conserva e salva il contenuto di quei file. Continuerai a inviare questi file tramite la CLI di Exercism, ma l'UCM può essere considerato una «fonte di verità» per il codice Unison.

Anche se Unison non ha un REPL (Read Evaluate Print Loop), puoi valutare rapidamente le espressioni Unison nelle «watch expressions». Nel file con suffisso .u, inizia una riga con > e inserisci un'espressione a destra.

> myFunction 42 "hi"

L'UCM mostrerà i risultati della valutazione dell'espressione quando salvi il file. Puoi usarlo per risolvere i problemi delle implementazioni degli esercizi.

Per un flusso di lavoro Exercism più approfondito, ecco un video dimostrativo che mostra come implementare e testare un esercizio di Exercism.

Caution

Il video dimostrativo mostra il flusso di lavoro per la versione precedente di Unison. Per il nuovo flusso di lavoro, con il nuovo flusso di progetto, vedi qui.

Organizzazione della codebase

Una codebase Unison è organizzata in «namespace». I namespace funzionano un po' come le directory di un file system, solo che invece di contenere file contengono i tipi e le funzioni Unison. I percorsi dei namespace sono separati da punti, .. Per esempio, possiamo riferirci al namespace Text dentro il namespace base con base.Text.

Ti consigliamo di creare un namespace per ogni esercizio che completi, oppure di entrarci con cd.

Import

La sintassi di Unison per gestire e specificare gli import è la sintassi use. Per esempio, use base.data.List porterebbe tutte le funzioni del namespace base.data.List nello scope. Può essere utile quando usi una funzione come map su una List che va disambiguata da altre funzioni map come Optional.map. Puoi anche importare funzioni specifiche facendo seguire il namespace da un elenco di funzioni separate da spazi da portare nello scope, come in: use base.data.List tails head flatMap.

Puoi usare la sintassi use sia al livello superiore di un file sia dentro le funzioni per specificare gli import. Le clausole use rispettano le regole dello scope lessicale, quindi gli import più annidati hanno la precedenza su quelli meno annidati.

Libreria standard

La libreria standard di Unison si chiama base. Per impostazione predefinita viene scaricata nelle nuove codebase Unison. Puoi sfogliare le funzioni disponibili per le tue implementazioni tramite il repository online per il codice Unison, Unison share, oppure tramite l'interfaccia locale della codebase, o cercando nell'Unison codebase manager (UCM). Ne parleremo tra poco.

Navigare l'Unison Codebase Manager (UCM)

Un elenco completo dei comandi dell'UCM è disponibile digitando help nell'UCM, ma ecco qualche consiglio e qualche convenzione.

Puoi cercare i termini per nome o per prefisso di namespace nell'UCM con il comando find, ma find supporta anche la ricerca basata sul tipo in una codebase. Per cercare una funzione in base alla sua firma di tipo, digita find seguito da uno spazio e dai due punti, ad esempio find : [a] -> [[a]].

Puoi elencare il contenuto di un namespace con il comando ls, per esempio ls base.data.List oppure ls .exercism.helloWorld. Molti comandi dell'UCM accettano come argomento sia percorsi di namespace relativi sia percorsi di namespace completamente qualificati. I percorsi completamente qualificati iniziano con un . che rappresenta la «radice» della codebase.

Spostati nell'UCM con il comando cd nella CLI. Se un namespace non esiste, cd ne creerà uno quando ci navighi. Per risalire di un namespace puoi usare cd ...

Risoluzione dei problemi

Quando carico i test, l'UCM non trova l'implementazione dell'esercizio.

Assicurati di salvare il file stub nel tuo editor di testo e di fare update dei termini nella codebase prima di caricare i test.

Sto incontrando conflitti di denominazione. Non posso avere due termini chiamati tests.

Puoi avere due termini con lo stesso nome in namespace diversi. Se stai completando esercizi di Exercism, ti consigliamo di creare un namespace separato per ogni esercizio, così che i test e gli stub siano separati dagli altri.

I miei test passano in locale ma non passano il test runner.

Ci dispiace! Prima di tutto controlla che gli import non facciano riferimento a nulla al di fuori della libreria standard, base, e delle funzioni definite nel file scratch in esame. Se è così, faccelo sapere nello Slack di Exercism nel canale #track-unison o aprendo una issue su il repository della track Unison.

Se hai qualsiasi problema, faccelo sapere! 🙂