通过 Exercism CLI 在本地使用 Unison 的技巧
你把 Unison 代码写在以.u为后缀的文件里。我们称它们为“草稿”文件,因为你用它们来编写 Unison 代码,但最终存储和保存这些文件内容的是 Unison 代码库管理器(UCM)。你仍然要通过 Exercism CLI 提交这些文件,不过对 Unison 代码来说,UCM 可以看作“权威来源”。
虽然 Unison 没有 REPL(读入-求值-打印循环),但你可以在“监视表达式”里快速求值 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这类函数,而它需要和其他map函数(比如Optional.map)区分开时,这就很有用。你也可以在命名空间后面跟一个以空格分隔的函数列表,只把指定的函数引入作用域,例如:use base.data.List tails head flatMap。
use语法既可以用在文件的顶层,也可以用在函数内部来指定导入。use子句遵循词法作用域的规则,因此嵌套更深的导入会优先于嵌套较浅的导入。
Unison 的标准库叫做base。默认情况下,新的 Unison 代码库会下载它。你可以通过 Unison 代码的在线代码仓库 Unison share,或者通过本地代码库界面,或者搜索 Unison 代码库管理器(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文件中定义的函数,没有引用别的东西。如果确实如此,请在 Exercism 的#track-unison Slack 频道告诉我们,或者给Unison 轨道仓库提 issue。
如果遇到任何问题,欢迎告诉我们!🙂