为什么是两个包,不是一个
| 包 | 内容 | 发不发 syscall |
|---|---|---|
std · 0.1.0 |
127 个模块:数值、容器、文本、摘要、压缩、编解码、图像、时间 | 一个都不发 |
host · 0.1.0 |
7 个模块:argv · dir · fs · io · log · stat · 包入口 |
发(getdents64 / openat / newfstatat 这类) |
依赖方向是单向的:host → std → numfmt,反不过来。这条方向是刻意的,不是碰巧——裸机、无宿主、或者只想要一段 CRC 的消费者,只依赖 std,不会把 getdents64 和目录遍历一起拖进二进制。基础内建之外最底下的那一层是 numfmt(整数转文本),它上面才长别的。
一句话:把「需要操作系统的」和「不需要的」分成两个包,是为了让后者能去没有操作系统的地方。
里面有什么
这里只列大类与几个代表。逐条索引在文档里——127 个模块每个一行说明,而且每行的说明都来自那个模块自己文件头的第一行,不是概括出来的。
整数、浮点、大数
math · intmath(gcd / powmod / 素性)· f64(软实现的 IEEE 754)· mathf · bigint · bigdec · rational · wide(128 位积)· matrix · stats
内存由调用方持有
arena · mall · pool · vec · deque · ring · map · mapstr · set · lru · trie · bst · heap · bitset · bloom,以及 graph / shortest / mst / unionfind
从字节到折行
utf8 · char · case · text · split · trim · quote · bufio · path · glob · search(KMP / BMH)· sort · udiff · width(东亚宽度)· wrap · table
实现都在源码里
sha256 · sha1 · sha512 · md5 · hmac · kdf(PBKDF2 / HKDF)· crc32 · crc16 · adler32 · deflate / inflate · zlibc · lzss · huffman · rle
读,但不建树
jsn(JSON)· cbor · mpk(MessagePack)· asn1 · toml · ini · csv · base64 / base32 / base58 / base85 · hex · url · varint · ansi
像素到单元格
raster(填充 / 线 / 圆)· blit(alpha 混合 / 缩放)· font(8×8 点阵)· bmp · png · qoi · tui(单元格网格 + 差异渲染)
几条贯穿全库的约定
- 公开名字带模块前缀 ——
hex_*、crc32_*、math_*、out_*。因为发射的符号名是平的、一个单元里顶层名字必须唯一,前缀是这条约束的纪律,不是命名癖好。 - 容器不收自己的账 ——
vec/arena/bst/pool/ring/bitset一律由调用方持有缓冲。bump 堆只有 64 KiB,库自己分配会把上限摊到每一个使用者身上。 - 格式读取是游标式的 ——
jsn/cbor/mpk/asn1/toml都不建树。同一个理由:建树要分配。 - 名字里有「不是」的东西会写明 ——
coro的文件头第一句就是「不是有独立栈的协程」,sched是「不是抢占式调度器」。免得有人按名字想当然。
用它之前要知道的一条边界
原先打包版有两个限制——单文件最多 8 条 use,以及名字形式的搜索只认仓库相对的四个根,于是装在用户机器上(没有仓库)时 use std 一个都找不到。0.1.4 Pre1 把这两条都改了:条数上限提到 300(超了报 E020),搜索改成三层——① <项目根>/deps/ ② 工具链自带的 store ③ 内置四根。
但 use std 仍然编不过。拿装好的 Pre2 实测:它找得到 std(名字写错立刻报「找不到或有歧义」,写 std 不报),然后把整个包装进来——耗时 9 分 4 秒(同一台机器上一个普通文件的 check 是 0.088 秒)——最后以一片错误收场:合并出来的单元里有重复的顶层名字(E13,mem / wide 被多个模块共用,就是菱形),另有一批元数与类型不符(E3 / E1)。所以结论分两半:找得到是 Pre1 修好的,合得起来不是。
实际用法照旧:按需 use 具体模块;要整体消费就交给 python tools/loment.py lib materialize——它走去重加物化,而不是把 127 个模块硬拼成一个单元。
想拿一份到手:它就是一个普通的包,用 Lompi 取——lompi install std。装到哪儿、从哪儿取、以及为什么网络那一步交给 git,都在 Lompi 那两页里。
use 的关系,都在 官方库 · std 与 host。Lompi 负责把依赖解析出来、发锁、物化;库本身怎么写,看 写一个 Loment 库。