在命令列上工作

透過 Exercism CLI 在本機使用 Unison 的訣竅


撰寫與求值 Unison 程式碼

你的 Unison 程式碼寫在副檔名為.u的檔案裡。我們稱這些檔案為「scratch」檔案,因為你用它們來寫 Unison 程式碼,但真正負責儲存、保存這些檔案內容的,是 Unison Codebase Manager (UCM)。你仍然會透過 Exercism CLI 提交這些檔案,不過對 Unison 程式碼來說,UCM 可以算是「真實來源」。

雖然 Unison 沒有 REPL(讀取-求值-輸出循環),但你可以用「watch expressions」快速求值 Unison 運算式。在副檔名為.u的檔案中,讓某一行以>開頭,並在右邊輸入運算式。

> myFunction 42 "hi"

儲存檔案後,UCM 會顯示該運算式的求值結果。當你在為練習的實作除錯時,這很好用。

想更深入了解 Exercism 的工作流,這裡有一支實作與測試 Exercism 題目的流程示範影片。

Caution

這支流程示範影片示範的是舊版 Unison 的工作流。新的工作流請參考這裡,裡面有新的專案工作流。

程式碼庫的組織

Unison 程式碼庫是以「命名空間」來組織的。命名空間的運作方式有點像檔案系統中的目錄,只是它們裝的不是檔案,而是你的 Unison 型別和函式。命名空間路徑以點號.分隔。舉例來說,我們可以用base.Text來指涉base命名空間中的Text命名空間。

我們建議你為每個正在完成的練習建立一個命名空間,或用cd切換進去。

匯入

Unison 用來管理和指定匯入的語法,就是use語法。例如use base.data.List會把base.data.List命名空間底下的所有函式帶入作用域。當你在List上使用像map這樣的函式,而需要把它和其他map函式(例如Optional.map)區分開來時,這就很有用。你也可以在命名空間後面接上一串以空格分隔的函式清單,只把特定的函式匯入作用域,例如:use base.data.List tails head flatMap。

你可以在檔案的頂層,也可以在函式內部使用use語法來指定匯入。use子句遵守詞法作用域的規則,因此巢狀程度較深的匯入優先於巢狀程度較淺的匯入。

標準函式庫

Unison 的標準函式庫叫做base。新的 Unison 程式碼庫預設會下載它。你可以透過 Unison 程式碼的線上儲存庫 Unison share、本機程式碼庫介面,或是在 Unison Codebase Manager (UCM) 中搜尋,來瀏覽你的實作能使用的函式。我們接下來會說明。

瀏覽 Unison Codebase Manager (UCM)

在 UCM 中輸入help,就能看到完整的 UCM 指令清單,不過這裡有幾個技巧和慣例。

你可以用find指令在 UCM 中依名稱或命名空間前綴搜尋定義,不過find也支援_以型別為基礎_搜尋程式碼庫。若要依型別簽章搜尋函式,請輸入find,後面接著一個空格和冒號,例如find : [a] -> [[a]]。

你可以用ls指令列出命名空間的內容,例如ls base.data.List或ls .exercism.helloWorld。UCM 中的許多指令可以接受相對的命名空間路徑引數,也可以接受完整限定的命名空間引數。完整限定的路徑會以.開頭,代表你程式碼庫的「根」。

用 CLI 中的cd指令在 UCM 裡移動。如果某個命名空間不存在,當你導覽過去時,cd會_建立_一個。要往上一層命名空間,可以用cd ..。

疑難排解

當我載入測試時,UCM 找不到我的練習實作。

在載入測試之前,請確認你已在文字編輯器中儲存存根檔,並在程式碼庫中update定義。

我遇到了命名衝突。我不能有兩個叫做tests的定義。

在不同命名空間中,你可以有兩個同名的定義。如果你正在完成 Exercism 的練習,建議為每個練習建立一個獨立的命名空間,讓測試和存根與其他內容分開。

我的測試在本機可以通過,卻無法通過測試執行器。

很抱歉!首先請檢查你的匯入除了標準函式庫base和受測scratch檔案中定義的函式之外,沒有引用其他東西。如果確實如此,請在 #track-unison Exercism Slack 上告訴我們,或到Unison 軌道的儲存庫開一個 issue。

如果有任何問題,請告訴我們!🙂