Exercism CLIを使ってローカルでUnisonを扱うためのヒントです。
Unisonのコードは、.uという拡張子のファイルに書きます。Unisonのコードを書くために使うことから、こうしたファイルを「scratch」ファイルと呼びますが、その内容を最終的に保存するのはUnison Codebase Manager(UCM)です。これらのファイルはこれまで通りExercism CLIで提出しますが、Unisonコードの「source of truth」はUCMだと考えられます。
UnisonにはREPL(対話的にコードを読み込んで評価し、結果を表示する仕組み)はありませんが、「watch expressions」を使えばUnisonの式を手早く評価できます。.u拡張子のファイルで、行の先頭に>を書き、その右側に式を入力します。
> myFunction 42 "hi"
ファイルを保存すると、UCMが式を評価した結果を表示します。演習の実装のトラブルシューティングに役立ててください。
Exercismでのより詳しいワークフローについては、Exercismの問題を実装してテストする様子を収めたウォークスルー動画があります。
このウォークスルー動画は、古いバージョンのUnisonのワークフローを紹介しています。新しいプロジェクトのワークフローについては、こちらを参照してください。
Unisonのコードベースは「名前空間」で構成されています。名前空間は、ファイルシステムのディレクトリに少し似ていますが、ファイルではなく、Unisonの型と関数を格納します。名前空間のパスは、ドット.で区切ります。たとえば、base名前空間にあるText名前空間は、base.Textで参照できます。
取り組む演習ごとに名前空間を作成し、そこへcdすることをおすすめします。
Unisonでインポートを管理・指定するための構文は、use構文です。たとえばuse base.data.Listと書くと、base.data.List名前空間にあるすべての関数がスコープに入ります。これは、Listに対してmapのような関数を使うときに、Optional.mapのような他のmap関数と区別する必要がある場合に便利です。名前空間のあとに、スコープに入れたい関数をスペースで区切って並べれば、特定の関数だけをインポートすることもできます。たとえば、use base.data.List tails head flatMapのように書きます。
use構文は、ファイルのトップレベルでも関数の中でも使ってインポートを指定できます。use節は字句スコープの規則に従うため、より深く入れ子になったインポートが、そうでないインポートより優先されます。
Unisonの標準ライブラリはbaseと呼ばれます。新しいUnisonコードベースには、デフォルトでダウンロードされています。実装で使える関数は、UnisonコードのオンラインリポジトリであるUnison share、ローカルのコードベースUI、またはUnison Codebase Manager(UCM)での検索から眺めることができます。検索については、このあと説明します。
UCMでhelpと入力すると、UCMのコマンドの完全な一覧を確認できますが、ここではいくつかのヒントと慣習を紹介します。
UCMではfindコマンドで名前や名前空間のプレフィックスから用語を検索できますが、findはコードベースの_型に基づく_検索にも対応しています。型シグネチャで関数を検索するには、findのあとにスペースとコロンを続けて入力します。たとえば、find : [a] -> [[a]]のように書きます。
名前空間の内容はlsコマンドで一覧できます。たとえば、ls base.data.Listやls .exercism.helloWorldのように使います。UCMの多くのコマンドは、相対的な名前空間パスの引数と、完全修飾の名前空間の引数のどちらも受け付けます。完全修飾のパスは、コードベースの「ルート」を表す.で始まります。
UCM内を移動するには、CLIのcdコマンドを使います。存在しない名前空間へcdすると、その名前空間が_作成_されます。1つ上の名前空間へ移動するには、cd ..を使います。
テストを読み込もうとすると、UCMが演習の実装を見つけられません。
テストを読み込む前に、テキストエディタでスタブファイルを保存し、コードベースの用語をupdateしておいてください。
名前の衝突が起きています。testsという名前の用語を2つ持つことはできません。
異なる名前空間であれば、同じ名前の用語を2つ持つことができます。Exercismの演習を進めるときは、演習ごとに別の名前空間を作成し、テストやスタブが他と混ざらないようにすることをおすすめします。
ローカルではテストが通るのに、テストランナーでは通りません。
ご迷惑をおかけしてすみません! まず、インポートが標準ライブラリのbaseと、テスト対象のscratchファイルで定義されている関数以外を参照していないか確認してください。その場合は、ExercismのSlackの#track-unisonで知らせるか、Unisonトラックのリポジトリにissueを立てて教えてください。
何か問題があれば、ぜひ教えてください! 🙂