Arbeiten auf der Kommandozeile

Tipps für die lokale Arbeit mit Unison über die Exercism-CLI


Unison-Code schreiben und auswerten

Du schreibst Unison-Code in Dateien mit der Endung .u. Wir nennen sie „scratch“-Dateien, weil du sie zum Schreiben von Unison-Code verwendest, aber letztlich ist es der Unison Codebase Manager (UCM), der den Inhalt dieser Dateien ablegt und speichert. Du reichst diese Dateien weiterhin über die Exercism CLI ein, aber der UCM kann als „maßgebliche Quelle“ für Unison-Code betrachtet werden.

Unison hat zwar keinen REPL (Read Evaluate Print Loop), aber du kannst Unison-Ausdrücke schnell in „Watch-Expressions“ auswerten. Beginne in deiner Datei mit der Endung .u eine Zeile mit > und gib rechts davon einen Ausdruck ein.

> myFunction 42 "hi"

Beim Speichern der Datei zeigt der UCM die Ergebnisse der Auswertung des Ausdrucks an. Das kannst du zur Fehlersuche in deinen Übungsimplementierungen nutzen.

Für einen ausführlicheren Exercism-Workflow gibt es hier ein Walkthrough-Video, in dem eine Exercism-Aufgabe implementiert und getestet wird.

Caution

Das Walkthrough-Video zeigt den Workflow für die ältere Version von Unison. Den neuen Workflow samt neuem Projekt-Workflow findest du hier.

Organisation der Codebase

Eine Unison-Codebase ist in „Namespaces“ organisiert. Namespaces funktionieren ein wenig wie Verzeichnisse in einem Dateisystem, nur dass sie statt Dateien deine Unison-Typen und -Funktionen enthalten. Namespace-Pfade werden durch Punkte . getrennt. Zum Beispiel können wir den Text-Namespace im base-Namespace mit base.Text ansprechen.

Wir empfehlen dir, für jede Übung, die du bearbeitest, einen eigenen Namespace anzulegen oder mit cd hineinzuwechseln.

Imports

Die Syntax von Unison zum Verwalten und Angeben von Imports ist die use-Syntax. Zum Beispiel würde use base.data.List alle Funktionen unter dem base.data.List-Namespace in den Gültigkeitsbereich holen. Das ist nützlich, wenn du eine Funktion wie map auf einer List verwendest, die von anderen map-Funktionen wie Optional.map abgegrenzt werden muss. Du kannst auch einzelne Funktionen importieren, indem du nach dem Namespace eine durch Leerzeichen getrennte Liste der Funktionen angibst, die in den Gültigkeitsbereich geholt werden sollen, etwa: use base.data.List tails head flatMap.

Du kannst die use-Syntax sowohl auf oberster Ebene einer Datei als auch innerhalb von Funktionen verwenden, um Imports anzugeben. use-Klauseln folgen den Regeln des lexikalischen Gültigkeitsbereichs, daher haben tiefer verschachtelte Imports Vorrang vor weniger tief verschachtelten.

Standardbibliothek

Die Unison-Standardbibliothek heißt base. Standardmäßig wird sie in neuen Unison-Codebases heruntergeladen. Du kannst die Funktionen, die deinen Implementierungen zur Verfügung stehen, im Online-Repository für Unison-Code, Unison share, oder über die local codebase ui durchstöbern, oder indem du den Unison Codebase Manager (UCM) durchsuchst. Das beschreiben wir als Nächstes.

Im Unison Codebase Manager (UCM) navigieren

Eine vollständige Liste der UCM-Befehle erhältst du, wenn du help im UCM eingibst, aber hier sind ein paar Tipps und Konventionen.

Du kannst im UCM mit dem Befehl find nach Terms per Name oder Namespace-Präfix suchen, aber find unterstützt auch die typbasierte Suche in einer Codebase. Um nach einer Funktion per Typsignatur zu suchen, gib find gefolgt von einem Leerzeichen und einem Doppelpunkt ein, z. B. find : [a] -> [[a]].

Mit dem Befehl ls kannst du den Inhalt eines Namespace auflisten, zum Beispiel ls base.data.List oder ls .exercism.helloWorld. Viele Befehle im UCM akzeptieren entweder relative Namespace-Pfade oder voll qualifizierte Namespace-Angaben als Argumente. Voll qualifizierte Pfade beginnen mit einem ., das die „Wurzel“ deiner Codebase darstellt.

Bewege dich mit dem Befehl cd in der Kommandozeile durch den UCM. Wenn ein Namespace nicht existiert, erstellt cd einen, sobald du dorthin navigierst. Um eine Ebene nach oben zu gehen, kannst du cd .. verwenden.

Fehlerbehebung

Wenn ich die Tests lade, kann der UCM meine Übungsimplementierung nicht finden.

Achte darauf, dass du deine Stub-Datei in deinem Texteditor speicherst und die Terms in deiner Codebase mit update aktualisierst, bevor du die Tests lädst.

Ich stoße auf Namenskonflikte. Ich kann nicht zwei Terms mit dem Namen tests haben.

Du kannst zwei Terms mit demselben Namen in verschiedenen Namespaces haben. Wenn du Exercism-Übungen bearbeitest, empfiehlt es sich, für jede Übung einen eigenen Namespace anzulegen, damit Tests und Stubs von den anderen getrennt bleiben.

Meine Tests bestehen lokal, aber nicht im Test-Runner.

Das tut mir leid! Prüfe zuerst, ob deine Imports nichts anderes als die Standardbibliothek base und die Funktionen referenzieren, die in der getesteten scratch-Datei definiert sind. Wenn das der Fall ist, lass es uns bitte im Exercism-Slack #track-unison wissen oder lege ein Issue im Unison-Track-Repo an.

Wenn du irgendwelche Probleme hast, lass es uns bitte wissen! 🙂