公告

FujoOS公布日延期,以仓库发布为准

首页 Loment · Potato 官方库

语言里没有标准库。这是一份库。

Loment 里只有内建函数——alloc / load8 / str_* / syscall4 那一组,二十来个;没有 String,没有 Vec,没有 HashMapstd 与 host 是官方维护的库,和你能写的那个库是同一种东西——依赖一样从源码的 use 来,身份一样是内容哈希。

127 std 里的模块(外加一个包入口,共 128 个文件)
0 std 里发出去的 syscall 数量
2 包:可移植的 std,与带 syscall 的 host
1 依赖方向:host → std → numfmt(单向)

为什么是两个包,不是一个

内容 发不发 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 秒)——最后以一片错误收场:合并出来的单元里有重复的顶层名字(E13mem / wide 被多个模块共用,就是菱形),另有一批元数与类型不符(E3 / E1)。所以结论分两半:找得到是 Pre1 修好的,合得起来不是。

实际用法照旧:按需 use 具体模块;要整体消费就交给 python tools/loment.py lib materialize——它走去重加物化,而不是把 127 个模块硬拼成一个单元。

想拿一份到手:它就是一个普通的包,用 Lompi 取——lompi install std。装到哪儿、从哪儿取、以及为什么网络那一步交给 git,都在 Lompi 那两页里。

完整模块索引在文档里: 127 个模块逐条一行说明、以及它们和 use 的关系,都在 官方库 · std 与 hostLompi 负责把依赖解析出来、发锁、物化;库本身怎么写,看 写一个 Loment 库