在 Unison 軌道上測試

了解如何在 Exercism 上測試你的 Unison 練習


認識 Unison Codebase Manager

Unison Codebase Manager(UCM)是一個執行 Unison 程式語言,並讓你瀏覽自己所撰寫與儲存的 Unison 程式碼的工具。

💡 請記住:Unison 程式碼並非以文字檔內容的形式儲存。因此,我們需要一個能讓我們修改並執行 Unison 程式的工具。

撰寫 Unison 程式碼,就跟打開你慣用的終端機,然後在你要撰寫 Unison 程式碼的目錄中執行ucm指令一樣簡單。接著,你可以用你慣用的文字編輯器建立或開啟一個副檔名為.u的檔案,例如scratch.u或hello.u。你的工作流程大部分會是在執行中的ucm命令列執行個體與你的.u檔之間來回切換。只要儲存檔案,UCM 就會自動監聽你的.u檔的變更。

Unison 沒有目錄結構,而是透過「命名空間」來組織程式碼庫。你會探索標準函式庫中名為base的命名空間,從中尋找有用的函式與資料型態,並在你撰寫 Unison 程式碼的過程中建立自己的命名空間。在 UCM 中,你可以用ls和view這兩個指令在程式碼庫中導覽,它們分別用來列出命名空間的內容與檢視原始碼。

雖然你可以透過 UCM 命令列瀏覽並檢視你的程式碼庫,但你可能也想看看自己成果的圖形化呈現。你可以在 UCM 命令列中執行ui指令來達成。它會開啟一個瀏覽器視窗,顯示你程式碼庫中的程式碼。本機程式碼庫 UI 也是探索標準函式庫(名為base)中函式的好方法,這對完成練習可能很有幫助。在這裡進一步了解本機程式碼庫 UI。

你可以用 Unison 語言導覽 來練習 Unison 的程式設計工作流。

Exercism 測試設定

快速總覽

  1. 使用project.create指令建立一個新專案,並替它取個名字(例如project.create hello-world)

  2. 讓 UCM 監看練習目錄,並在<myFileName>.u檔中進行修改

  3. 儲存<myFileName>.u檔

  4. 如果檔案通過型別檢查,就執行add或update這兩個 UCM 指令

    • 如果檔案沒有通過型別檢查,就修改<myFileName>.u檔中的程式碼,直到它能編譯為止
  5. 在 UCM 命令列中執行load <myFileName>.test.u指令,把測試載入作用域並執行

詳細逐步說明

如果你是在命令列上解 Exercism 的題目,你很可能會在以該練習命名的目錄中實作你的解法。舉例來說,如果練習是hello-world,你應該先cd到~/exercism/unison/hello-world,再從命令列開啟ucm,並在ucm中建立一個專案(例如project.create hello-world)。在hello.u檔中進行你的實作修改,當你對自己的實作感到滿意時,就在 Unison Codebase Manager 命令列(UCM)中輸入add或update指令,把你從檔案完成的工作加入程式碼庫。

每個練習的測試檔都以.test.u為副檔名。你會想在 UCM 中使用load指令,把測試載入作用域並執行。load指令以檔案路徑作為引數。以 hello world 練習與hello-world專案為例,情況大概會像這樣:

hello-world/main> load hello.test.u

你應該會看到 UCM 的訊息,說明哪些詞彙被載入作用域,更重要的是,也會顯示執行測試的結果:


  ⍟ These new definitions are ok to `add`:

    hello.test : Test.Test
    tests      : [Result]

Now evaluating any watch expressions (lines starting with
`>`)... Ctrl+C cancels.


  6 | test> tests = runAll [hello.test]

  🚫 FAILED

假設你的測試第一次沒有通過。切換回你的myExercise.u檔繼續編輯,儲存之後你就可以update:

I found and typechecked these definitions in ~/Exercism/unison/hello-world/hello.u. If you do an
`add` or `update`, here's how your codebase would change:

  ⍟ These names already exist. You can `update` them to your new definition:

    hello : Text

hello-world/main> update

⍟ I've updated these names to your new definition:

  hello : Text

接著我們可以重新載入測試,看看有沒有任何變化!

hello-world/main> load hello.test.u
  Now evaluating any watch expressions (lines starting with `>`)... Ctrl+C cancels.


  6 | test> tests = runAll [hello.test]

  ✅ Passed : Passed 1 tests.

實用的 UCM 指令

如要查看可與你的程式碼庫互動的指令清單,請在 Unison Codebase Manager 命令列中執行help。UCM 指令的清單也在我們的網站上有說明。以下是幾個可能派得上用場的指令:

  • add:將.u檔中新的定義加入程式碼庫。
  • update:運作方式與add類似,差別在於如果檔案中的某個定義與現有定義同名,該名稱就會更新為指向新的定義。
    • 如果舊定義有任何相依項目,update 會盡可能自動散布這項變更,或是建立一個todo項目,供日後重構使用。
  • load:剖析、型別檢查並求值指定的.u副檔名草稿檔。完成型別檢查與求值後,你就可以把這些詞彙加入程式碼庫。
  • ls:列出命名空間的內容
  • view:檢視指定 Unison 定義的原始碼
  • ui:開啟本機程式碼庫 UI
  • exit:關閉 UCM