贡献指南
本指南汇集了参与 luna-poly 开发的约定。Luna Flow 组织规则在此之上同样适用。
提交拉取请求之前
在仓库中运行(./ready_to_pr.sh 会运行 moon fmt、moon check、moon test 和 moon info):
moon fmt
moon check --target all
moon test
moon info
审查每个 pkg.generated.mbti 的差异:它是公开 API 的权威来源,其中的任何变化都是 API 变化,文档和变更日志必须反映出来。
代码风格
- 用
moon fmt格式化;顶层项之间用///|分隔。 - 绑定、函数、文件和文件夹使用 snake_case,类型和 trait 使用 PascalCase。文件按其实现的内容命名(
sparse_polynomial.mbt),而不是utils.mbt。 - 显式的方法提升(
pub extend T with Trait::{...})放在extends.mbt中。提升运算符、equal、compare、hash和规范的to_string;其他 trait 方法只通过 trait 提供,兼容性提升标记为#deprecated和#doc(hidden)。 - 在黑盒测试中,被测包的名字要加限定(
@immut.DensePolynomial);白盒测试(*_wbtest.mbt)可以不加限定地使用它们。
库约定
- 规范形式。 每个公开操作都返回规范值:修剪过的稠密向量、严格降序且已合并的项数组、不含零的稀疏映射。新操作必须在返回前恢复该不变量。
- 最小约束。 每个函数只要求它所用到的
luna-generic能力。 - 带检查的变体。 部分操作有一个会中止的形式,以及一个在违反契约时返回
None的*_checked形式。中止消息要指出被违反的契约。 - 两层。 先在
immut中添加操作;再以相同的名字和参数顺序添加可变版本,除非原地存储能带来实际好处,否则委托给immut,并在src/consistency中添加检查。在 mutable 设计中记录每一处有意的差异。 - 变更须显式命名。 只有 setter、
clear、add_term_inplace和*_inplace方法可以修改其接收者。
文档
手册遵循 Luna Flow 文档标准:英文页面位于 doc/manual(每个包各有一个 api/、design/ 和 tutorial/ 页面,以包路径命名),中文和日文翻译以 gettext 目录的形式位于 doc/locale。编辑英文页面后,运行 lunadoc update 并翻译新的或模糊(fuzzy)的消息。每个可运行的 moonbit 代码块都必须能针对当前代码编译通过;有意保留的片段标记为 moonbit nocheck。
提交
使用英文的 Conventional Commits,<type>(<scope>): <subject>,以包作为 scope(fix(immut/context): ...),每个提交只包含一个逻辑变更。如果你不是维护者,在修改依赖或 moon.mod 中的版本之前请先询问。