Skip to content

标准库总览 ​

Code CIN 官方标准库由 41 个 pic 包组成(codecin/lib/<name>/pic.toml + src/<name>.cin),随 pip 包一起分发。 它们本身是用 CIN 语言写成的模块,不是宿主内建函数:编译器在编译主文件时按需展开, 因此函数签名、边界行为和返回值都可以直接阅读源码核对。

标准库按职责分层:纯计算类库(数组、排序、数学、统计、哈希、位运算)只依赖语言内建, 任何运行方式下行为一致;C / C++ / Go 标准库兼容层(cstd / cppstd / gostd)用惯用命名封装同样只依赖内建的 API;而文件、画布、Termux、键盘、网络(net)、 FFI(ffi)这类库依赖宿主能力,由 Go 原生引擎实现,--sandbox 下调用会被拦截。 用 codecin --libs 可列出全部库及其能力要求。

分发位置与查找规则 ​

你写的 import编译器解析到说明
import "math.cin"codecin/lib/math/src/math.cin官方标准库的规范写法
import "math"codecin/lib/math/src/math.cin包入口写法,与 math.cin 等价
import "lib/math.cin"codecin/lib/math/src/math.cin历史兼容别名,两者等价
import "./util.cin"当前 .cin 文件同目录的 util.cin项目自有模块,必须带 ./ 前缀

要点:

  • import 只能出现在文件顶部(列首);
  • 不带 ./ 前缀的名字一律当作内置库名,不会去当前目录找;
  • 同一文件每个编译只包含一次(防重复),循环引用报错,缺失模块报 Import file not found;
  • 标准库之间可以层层引用(例如 codecin/lib/termux/src/termux.cin 内部 import "json.cin")。

模块解析的完整规则见 模块与标准库。

命名前缀约定 ​

标准库不位于独立的命名空间,所有函数都是全局符号。为避免冲突,每个库使用固定的前缀:

前缀库前缀含义
f_math.cinfloat 浮点辅助
i_math.cinint 整数辅助
s_str.cinstring 字符串变换
a_array.cinarray 整数数组
sort_sort.cin排序
bin_sort.cin二分查找
c_conv.cinconvert 进制与格式化
v_vec.cinvector 浮点向量与统计
r_rand.cinrandom 随机
j_json.cinjson 扁平取值
k_key.cinkey 键盘监听(K_ 为 enum Key 键码常量)
t_time.cin / test.cintime 时间;test 断言(两库共享 t_,勿同时导入)
io_io.cin文件与路径
g_gui.cingraphics 画布绘图
tx_termux.cinTermux API
bits_bits.cin位运算
stat_stat.cin顺序统计
hash_hash.cin哈希
val_validate.cin校验与安全解析
mat_matrix.cinmatrix 方阵
queue_ / stack_queue.cin环形队列 / 栈
bi_bigint.cinbig integer 任意精度整数
bs_bitset.cinbit set 多字位集合(512 位)
codec_codec.cin编码与简单加密
comb_combin.cin数论与组合数学
csv_csv.cin单行 CSV 解析与生成
dp_dp.cindynamic programming 动态规划
fmt_fmt.cinformat 排版与格式化输出
fr_frac.cinfraction 有理数(分数)
graph_graph.cin定长图(邻接矩阵)
heap_heap.cin定长二叉堆
path_path.cin纯字符串路径处理(含 path_str_*)
set_set.cin整数集合(位图)
txt_text.cintext 文本处理
tok_token.cintoken 切分 / 分词
tree_tree.cin定长二叉搜索树
uf_unionfind.cinunion-find 并查集
libc_cstd.cinC 语言标准库兼容层(<ctype.h> / <string.h> …)
stl_cppstd.cinC++ STL 兼容层(std::string / vector / stack / queue)
go_gostd.cinGo 标准库兼容层(strings / strconv / math / slices / os)
ffi_ffi.cinFFI 动态库调用便捷封装
—(函数名以 http_ / tcp_ / udp_ / dns_ 开头)net.cin网络便捷封装

t_ 前缀冲突

codecin/lib/time/src/time.cin 与 codecin/lib/test/src/test.cin 都使用 t_ 前缀且符号不同名,同时导入不会报 重复定义,但两库混用后函数名容易看错(t_report 是测试库、t_hms 是时间库)。 建议在测试文件里只导入 test.cin,把时间格式化放到别的模块中。

总览表 ​

「函数个数」按 codecin/lib/<库>/src/<库>.cin 中 function 定义逐个数出,与源码一致。

库前缀函数个数用途依赖宿主能力
math.cinf_ i_9取整、最值、夹取否
str.cins_7大小写、包含/前后缀、计数、重复否
array.cina_14整数数组求和/最值/查找/反转/填充/拷贝否
sort.cinsort_ bin_7冒泡/选择/插入/快速排序、有序判定、二分查找否
conv.cinc_12十六进制/二进制转换、填充、字符与浮点解析否
vec.cinv_12浮点向量求和/均值/方差/点积/范数/归一化否
rand.cinr_7区间随机、随机浮点、洗牌、随机取元素否(依赖内建 rand)
json.cinj_6扁平 JSON 字段取值(字符串/整数/浮点/布尔)否
time.cint_6时间戳、HH:MM:SS/MM:SS、时长拆解与人性化否(依赖内建 time)
bits.cinbits_17popcount/clz/ctz、位读写、循环移位、位序与字节序反转否
stat.cinstat_15整数顺序统计:中位数/众数/百分位/直方图/方差否
hash.cinhash_7djb2 / FNV-1a / sdbm、整数混合、桶下标映射否
validate.cinval_15字符类别、整型/浮点/标识符/颜色校验、限幅、安全解析否
matrix.cinmat_15方阵加减乘、转置、迹、行列式、对称性判定否
queue.cinqueue_ stack_16定长环形队列(FIFO)与定长栈(LIFO)否
test.cint_7轻量断言与通过/失败计数汇总否
key.cink_ K_3键盘轮询:键码常量、Ctrl 组合、扩展键判定、阻塞等一键是(Go 原生)
io.cinio_15文件读写/追加/删除/大小、目录、路径、按行与按分隔取值是(Go 原生)
gui.cing_9画布建面/清屏/边框、柱状图与折线图、导出 PNG、弹窗查看是(Go 原生)
termux.cintx_19Termux 通知/Toast/剪贴板/振动/TTS/短信/电池/定位/WiFi是(Go 原生)
bigint.cinbi_34任意精度十进制整数:四则、幂、阶乘、比较、饱和与溢出标志否
bitset.cinbs_35512 位位集合(双槽):置位/计数/位移/逻辑运算否
codec.cincodec_26十六进制/URL/Base64/RLE/摩尔斯编解码、凯撒与 XOR否
combin.cincomb_26素数筛、阶乘/排列/组合、卡特兰数、数论判定、进制转换否
csv.cincsv_23单行 CSV 解析与生成:引号转义、字段取值、行缓冲否
dp.cindp_130/1 背包、LCS、编辑距离、LIS、零钱、网格最小路径和否
ffi.cinffi_16FFI 动态库调用:加载/查符号/整数与浮点调用(0..8 参数封装)/卸载是(Go 原生;--sandbox 拦截)
fmt.cinfmt_21定点小数、千位分隔、对齐居中、比例条、表格单元格与边框否
frac.cinfr_19有理数(分数)精确运算与比较、自动约分否
graph.cingraph_20邻接矩阵图:BFS/DFS/拓扑排序/Dijkstra/连通性判定否
heap.cinheap_14定长二叉堆(最小/最大)与就地堆排序否
net.cinhttp_ tcp_ udp_ dns_17网络便捷封装:带头部 HTTP、状态码判定、TCP 按行收发与回环、UDP 数据报、DNS 解析是(Go 原生;--sandbox 拦截)
path.cinpath_18纯字符串路径:分段、扩展名、规范化、公共前缀、包含判定否
set.cinset_26整数集合(位图,128 元素三槽):并/交/差与集合查询否
text.cintxt_22大小写无关比较、替换、切片/插入/删除、标题化与词数否
token.cintok_10按分隔串或空白切分取 token(计数、取值、取长、查找)否
tree.cintree_15二叉搜索树:插入、查询、三种遍历、高度与叶子数否
unionfind.cinuf_8并查集(按秩合并 + 路径压缩)否
cstd.cinlibc_56C 标准库兼容层:ctype 字符类别、string 内存/串操作、stdlib abs/rand/qsort、math 取整三角、stdio 输出否
cppstd.cinstl_57C++ STL 兼容层:std::string 方法、vector/stack/queue(数组 + 长度游标)、algorithm 排序/钳制否
gostd.cingo_46Go 标准库兼容层:strings、strconv(含任意进制)、math、slices、os.Args否(go_os_args_* 依赖命令行参数内建)

C / C++ / Go 标准库兼容层 ​

cstd.cin / cppstd.cin / gostd.cin 把 C、C++、Go 三门语言最常用的标准库 API 按惯用命名移植成纯 CIN 函数(libc_strlen / stl_vec_push_back / go_strings_contains), 方便从现有代码迁移算法或按语言文档查阅语义:

cin
import "cstd.cin"
import "cppstd.cin"
import "gostd.cin"

function main() -> int {
    // C: <ctype.h> + <string.h>
    if (libc_isdigit('7') == 1) { libc_puts("digit") }
    println(libc_strupr("hello"))                 // HELLO
    // C++: std::vector<int> = 数组 + 长度游标 (push/pop 返回新长度)
    int v[8]
    int n = 0
    n = stl_vec_push_back(v, n, 3)
    n = stl_vec_push_back(v, n, 1)
    stl_sort(v, n)
    // Go: strings / strconv
    println(go_strings_repeat("ab", 3))           // ababab
    println(go_format_int(255, 16))               // ff
    return 0
}

语义约定(各库头注释均有注明):

  • cstd:类型映射 C char* → string、C char → 字符码 int、C 数组 → 数组引用 + 显式长度;无法以 CIN 表达的指针返回值(如 strchr)改为返回下标;
  • cppstd:CIN 无模板与引用,容器以「数组 + 长度游标」表达, push_back / pop_back 返回新长度由调用方存回;npos 以 -1 表示;
  • gostd:函数名保持 pkg.Func 习惯(go_strings_trim_space 对应 strings.TrimSpace);go_os_args_len / go_os_args_get 依赖命令行参数内建。

三库都是纯 CIN(只调用语言内建),行为与运行方式无关。 逐一核对函数签名与边界行为请直接阅读 codecin/lib/*/src/*.cin 源码。

纯 CIN 库与宿主能力库 ​

纯 CIN 库(上表「依赖宿主能力 = 否」的 35 个,含三个兼容层库)内部只调用语言内建,例如 codecin/lib/matrix/src/matrix.cin 只用数组与循环,codecin/lib/conv/src/conv.cin 只用 substr/strlen/atoi。它们不发起任何宿主 SYS 调用,--sandbox 下也可正常运行:

bash
codecin prog.cin                # Go 原生引擎执行 (默认)
codecin prog.cin --sandbox      # 拦截宿主 SYS, 纯计算库不受影响

宿主能力库(io.cin / gui.cin / termux.cin / key.cin / ffi.cin / net.cin)转调 file_*、canvas/draw_line、termux_*、key_hit/get_key、dlopen/ffi_call、 tcp_*/udp_* 等内建,这些内建全部由 Go 原生引擎实现,--sandbox 下会被拦截并报 Host capability disabled in sandbox mode。另有两个库处于中间地带:

  • rand.cin 依赖内建 rand(),time.cin 依赖内建 time()——它们由运行时的 SYS 指令实现, 不发起宿主调用,因此不算宿主能力库;
  • gui.cin 与 io.cin 的正确性测试需要原生引擎(tests/test_libs.py 里标了 needs_native)。

宿主能力的完整清单与各平台可用性见 宿主能力。

快速上手 ​

新建 demo.cin,导入数学与数组两个库并在 main 中调用:

cin
import "math.cin"
import "array.cin"
import "sort.cin"

function main() -> int {
    int a[5] = {9, 2, 7, 1, 5}
    sort_quick_all(a, 5)                       // 原地升序
    println("sorted0=" + int_to_str(a[0]))     // 1
    println("sum=" + int_to_str(a_sum(a, 5)))  // 24
    println("clamp=" + int_to_str(i_clamp(99, 0, 10)))   // 10
    return 0
}
bash
codecin demo.cin
text
sorted0=1
sum=24
clamp=10

更完整的演示(array / sort / conv / vec / json / time / test 七库联动)见仓库内 examples/stdlib_demo.cin,模块引用示例见 examples/modules_demo.cin。

从内建到标准库 ​

标准库是内建的语义化包装,改写时理解这一点很重要——内建是单条指令的原子操作, 标准库函数通常带边界处理与默认约定。下面两者输出相同,但浮点路径不同:

cin
import "math.cin"

function main() -> int {
    println(float_to_str(f_round(2.5)))    // 3
    return 0
}

内建函数的整体清单(sqrt/pow/idiv/substr/strlen/rand/srand/time 等)见 内建函数。

下一步 ​

文档由 VitePress 构建