仓库约定
这些规则是 floating 在 Luna-Flow 文档标准之上的补充,绝不会放宽该标准。本手册描述当前分支上的实现。当前发布版本为 0.8.0,即 moon.mod 中的版本。
章节与指南
每个包在每个章节中各有一页,以其包路径命名:
- API 参考(
api/<package>.md) 列出每个公开类型、函数、方法、错误和值,并给出其签名与可观察语义。 - 教程(
tutorial/<package>.md) 通过可编译的小示例逐步完成各项任务。 - 设计(
design/<package>.md) 解释表示方式、数学原理、不变量以及所做的决策,并以该包的边界作结。
四个数值核心 bin_float、decimal、decimal_gda 和 ball_float 在标准允许的范围内另有两个章节:
- 符合性(
conformance/<package>.md) 给出固定版本的、有限的证据声明及其排除项。 - 性能(
performance/<package>.md) 记录可复现的测量结果和特定于目标平台的分派证据,不作 API 承诺。
指南由 tools/doc_quality.py 固定:index.md(概览与包地图)、getting_started.md(包的选择与入门步骤)、numeric_semantics.md(共享的数值术语)、architecture.md(分层与职责)、verification.md(检查关卡与符合性范围)、performance_audit.md(历史性能基线的审计)以及本页。未同步更新该列表时,不要新增或重命名指南。
README.md 说明当前发布版本的定位并指向本手册。CHANGELOG.md 负责发布历史与迁移说明。
包页面
- 镜像每个
moon.pkg:src/<path>/moon.pkg中的包由api/<path>.md、tutorial/<path>.md和design/<path>.md记录。文件不会创建包,moon.pkg边界才会。 - 为每个包提供全部三类页面。没有应用 API 的包(前端、CLI、
internal/*、bench/*、consistency、doc_examples)仍需记录其生成接口、维护流程和稳定性边界。 - 每个包还要保留一个
src/<path>/README.mbt.md。 pkg.generated.mbti是公开接口的清单;源码和测试定义行为。只有当.mbti将某方法列为pub fn Type::name时,才能将其记录为可用点语法调用;trait 实现中的方法不会被隐式提升,必须用pub extend声明。- 不要把计划中的 API 写成已存在,也不要把研究笔记保留为独立页面。将持久的结论提升到设计、符合性或性能页面中,并把已被取代的历史移入
CHANGELOG.md。 - 页面只提及当前发布版本。只有当页面带有针对该版本的
<!-- historical-performance-baseline: X.Y.Z -->标记时,才可以提及更早的版本;tools/doc_quality.py会拒绝其他任何历史版本。
API 快照
每个 API 页面都以 ## Complete public interface 结尾,其正文是该包 pkg.generated.mbti 的精确副本,位于 <!-- generated-api-start --> 与 <!-- generated-api-end --> 标记之间,并用 mbti 代码块围起。页面正文中的单个签名也使用 mbti 代码块。tools/doc_quality.py 会将快照与生成的文件进行比较(也接受旧的 moonbit 代码块),因此每当 moon info 改变接口时都要重新生成快照。
数值文档规则
- 按照数值语义中的定义使用
precision、rounding、classify、sign、normalized、quantum、context和flags。 - 区分存储表示、精确值、舍入结果、状态标志、checked 错误和区间包络。
- 说明解析何时保留量子(quantum),以及规范化何时在不改变值的情况下改变同值类(cohort)。
- 指明 API 所使用的序。
compare、<和排序是一个全预序,它把每个 NaN 排在所有数之上;IEEE 偏序(含 unordered)和totalOrder是单独的 API。切勿暗示区间值存在标量序。 - 对于
*_ctxAPI,同时说明返回值和标志。 - 对于 checked API 和包装器,说明其特定于数值域的状态转换:结果错误、IEEE 标志累积,或 GDA 陷阱短路及其恢复。
- 必须把
decimal与decimal_gda写成两个独立合同:IEEE 运算返回逐 operation flags,GDA 运算通过GdaOutcome传递 sticky status 与 traps。 - 用 TeX(
$…$、$$…$$)书写数学内容,并引用推导所依赖的标准条款或经典结果。
示例
- 可运行的示例是完整的顶层项,通常是一个
test块,用moonbit代码块围起,并用inspect展示输出。它们必须能在当前分支上编译并通过。 - 不完整的片段、行文中的签名、可执行包的代码,以及无法从模块外部导入的
internal/*代码,使用moonbit nocheck代码块;moon.pkg片段使用text代码块。 - 导入别名:
Luna-Flow/luna-generic使用@lf_alg,Luna-Flow/arithmetic使用@lf_arith;floating 的各个包使用其默认别名(@bin_float、@decimal、…)。 - 只调用
.mbti中列出的内容。例如,BinFloat没有to_double或is_finite方法;请使用to_shortest_string和@def.is_finite(x)。
翻译
doc/manual 中的英文页面是唯一的源文本。译文存放在 gettext 目录 doc/locale/<locale>/LC_MESSAGES/manual.po 中,覆盖 doc/conf.json 所列的语言区域,绝不以页面副本的形式编辑。不要翻译标识符、包名、路径、命令、版本字符串或数学内容。Typst 附件位于 doc/attachments/,由所有语言区域共享。
审核清单
- 运行
moon info,将每个有改动的pkg.generated.mbti与其 API 页面进行比较,并刷新## Complete public interface快照。 - 检查每个
moon.pkg仍有对应的api/、tutorial/和design/页面(以及四个核心的证据页面)。 - 针对当前分支编译并运行每个有改动的示例(
moonbit代码块)。 - 运行
python3 tools/doc_quality.py(或just docs,它还会运行src/doc_examples的测试)。 - 运行
lunadoc update以刷新doc/locale/manual.pot并合并翻译目录,翻译新增和 fuzzy 条目,然后检查lunadoc status(各语言区域的覆盖率)和lunadoc check --compile(布局、翻译目录、链接和 Typst 附件)。 - 提交前运行
moon fmt、moon check --target all --deny-warn、相关测试以及just pr。 - 版本发布时,同时更新
moon.mod、README.md中的版本号、本页以及CHANGELOG.md。