在 Unison 轨道上测试

了解如何在 Exercism 上测试你的 Unison 练习


熟悉 Unison 代码库管理器

Unison 代码库管理器(UCM)是运行 Unison 编程语言、并让你浏览自己编写和保存的 Unison 代码的工具。

💡 记住:Unison 代码不是以文本文件的形式保存的。因此,我们需要一个能修改和运行 Unison 程序的工具。

编写 Unison 代码很简单:打开你惯用的终端,在你要编写 Unison 代码的目录里运行ucm命令。然后,你可以用自己最喜欢的文本编辑器创建一个以.u为后缀的文件,或者打开这样一个文件,比如scratch.u或hello.u。你的大部分工作流,都是在正在运行的ucm命令行实例和你的.u文件之间来回切换。保存文件后,UCM 会自动监听这个以.u为后缀的文件中的改动。

Unison 代码库不采用目录结构,而是通过“命名空间”来组织。你会在标准库里名为base的命名空间中寻找有用的函数和数据类型,也会在编写 Unison 代码的过程中创建自己的命名空间。在 UCM 中,浏览代码库要用ls和view命令,它们分别用来列出命名空间的内容和查看源代码。

虽然你可以通过 UCM CLI 浏览和查看自己的代码库,但也许还想看到工作的漂亮图形化呈现。在 UCM CLI 里执行ui命令就能做到。它会打开一个浏览器窗口,显示你代码库中代码的视图。本地代码库界面也是探索我们标准库(名为base)中函数的好方法,这些函数可能对完成练习很有帮助。在这里进一步了解本地代码库界面。

你可以借助Unison 语言之旅来练习 Unison 的编程工作流。

Exercism 测试环境配置

快速概览

  1. 用project.create命令创建一个新项目,并为它命名(例如project.create hello-world)

  2. 在 UCM 监视该练习目录的情况下,在<myFileName>.u文件中进行修改

  3. 保存<myFileName>.u文件

  4. 如果文件通过了类型检查,就运行 UCM 的add或update命令

    • 如果文件没有通过类型检查,就修改<myFileName>.u文件中的代码,直到它能编译
  5. 在 UCM CLI 中运行load <myFileName>.test.u命令,把测试引入作用域并运行它们

详细步骤

如果你在命令行上做 Exercism 题目,那么很可能要在以该练习命名的目录里实现你的解答。例如,如果练习是hello-world,你就应该先cd到~/exercism/unison/hello-world,然后从命令行启动ucm,并在其中创建一个项目(例如project.create hello-world)。在hello.u文件中修改你的实现,满意之后,就在 Unison 代码库管理器 CLI(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 代码库管理器 CLI 中运行help。UCM 命令列表也在我们的网站上介绍过。下面这些可能比较有用:

  • add:把.u文件中的新定义添加到代码库。
  • update:用法和add一样,只不过如果文件中的某个定义与已有定义同名,这个名字就会更新为指向新定义。
    • 如果旧定义还有依赖它的定义,update会在可能的情况下自动传播这一改动,否则会创建一个todo项,留待以后重构。
  • load:解析、类型检查并求值给定的、以.u为后缀的临时文件。完成类型检查和求值后,你就可以把这些项添加到自己的代码库中。
  • ls:列出某个命名空间的内容
  • view:查看某个 Unison 定义的源代码
  • ui:打开本地代码库界面
  • exit:关闭 UCM