
编程语言编译器语言运行时标准库【免费下载链接】NimNim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).项目地址https://gitcode.com/gh_mirrors/ni/Nim点击查看免费下载system是 Nim 语言最底层、最核心的标准库模块任何 Nim 程序都无需import即可直接使用它提供的字符串、序列seq、集合set、数字运算、序数操作等基础设施。本文以 lib/system_overview.rst 为主线逐表解析该模块最常用的函数与操作符并结合 lib/system.nim 的源码实现讲解其底层语义读完即可熟练运用这些 API 编写高效、正确的 Nim 代码。system 模块的组成与文档导航system模块并非单文件孤岛它在 lib/system.nim 中通过include组合了多个子模块分布在 lib/system/ 目录下其各自的完整文档分别位于独立文件中。了解这一结构有助于你在需要深挖细节时快速定位子模块仓库实现文件负责内容iteratorslib/system/iterators.nimitems、pairs、countup等内建迭代器exceptionslib/system/exceptions.nim异常体系与Defect/CatchableError类型assertionslib/system/assertions.nimassert、doAssert、onFailedAssert等dollarslib/system/dollars.nim$字符串化基础设施ctypeslib/system/ctypes.nimC 语言兼容类型定义repr_v2lib/system/repr_v2.nim新版repr调试输出实现需要说明的是本概览只覆盖system中最常用的一小部分 API模块内还有大量函数未列出例如system还包含内存管理、反射、类型转换等设施。在官方文档页面中表格内的函数名均为可点击链接可直接跳转到对应函数的完整文档浏览时也可以借助左侧目录树或CtrlF在模块内快速检索。在本文中我们以仓库源码为索引逐类讲解。字符串与字符操作字符串是 Nim 中使用频率最高的类型。system提供的基础字符串 API 如下完整实现见 lib/system.nimProc用法len(s)返回字符串长度chr(i)将0..255范围内的int转换为字符ord(c)返回字符的int值a b拼接两个字符串s.add(c)向字符串追加字符$将各种类型转换为字符串len四种容器一个名字len在system中针对不同参数类型有多个重载全部通过编译器 magic 实现见 lib/system.nimlen(x: openArray){.magic: LengthOpenArray.}对openArray/varargs求长度len(x: string){.magic: LengthStr.}返回字符串字节长度len(x: cstring){.magic: LengthStr, noSideEffect.}对 C 字符串是 O(n) 的遍历除 JS 后端在运行时按 UTF-16 码元计数外注意\0是终止符cstringab\0c的len在非 JS 后端返回 2len(x: array){.magic: LengthArray.}等价于high(T) - low(T) 1因此array[-2..2, float].len 5len(x: seq[T]){.magic: LengthSeq.}。chr / ord字符与整数互转chr(u: range[0..255]): charlib/system.nim入参被限定在range[0..255]越界会在编译期或运行时被拒绝ord(x: T): intlib/system.nim返回序数值的内部int表示对带空洞的枚举enum with holes和 distinct 序数类型同样适用例如ord(A) 65。拼接与追加 与 adda b返回拼接后的新字符串不修改原变量s.add(c)/s.add(str)是原地追加lib/system.nim{.magic: AppendStrCh.}/AppendStrStr在循环中累加字符串时优先使用add可避免反复分配。延伸阅读原文档 See also字符串处理不止于此system之外还有专门的字符串工具模块lib/pure/strutils.nim常用字符串函数分割、替换、大小写转换等lib/pure/strformat.nim字符串插值与格式化与fmtlib/pure/unicode.nimUnicode UTF-8 处理lib/pure/strscans.nimscanf/scanp宏比正则表达式更轻量地提取子串lib/pure/strtabs.nim高效的字符串→字符串哈希表字典。序列seq操作序列是 Nim 中可动态增长的同构数组容器system为其提供了完整的创建与增删改查 APIProc用法newSeq创建指定长度的新序列newSeqOfCap创建零长度、但预分配指定容量的序列setLen设置序列长度len返回序列长度将数组转换为序列add向序列末尾追加元素insert在指定位置插入元素delete删除元素并保持元素顺序O(n) 操作delO(1) 删除不保持顺序pop移除并返回序列最后一个元素x y拼接两个序列x[a .. b]切片两端都包含x[a .. ^b]切片b为反向索引两端包含x[a .. b]切片不包含上界newSeq 的初始化语义newSeq(s, len)等价于s []; setLen(s, len)但更高效无需重分配。其两种调用形式lib/system.nim# 形式一先声明再初始化 var inputStrings: seq[string] newSeq(inputStrings, 3) assert len(inputStrings) 3 inputStrings[0] The fourth inputStrings[1] assignment inputStrings[2] would crash # inputStrings[3] out of bounds # 越界会触发 IndexDefect # 形式二直接返回 var inputStrings2 newSeqstring关键语义新序列会被填充为零值条目创建后应使用索引赋值而非add填充否则会越界或破坏长度假设。newSeqOfCapintlib/system.nim则返回len 0、容量为 5 的序列适合预先知道元素规模上限、随后用add填充的场景——避免渐进式扩容的多次重分配。若需零值未初始化性能敏感的序列可进一步查看newSeqUninit。三种删除方式的选择这是最容易踩坑的区别点源码中的语义lib/system.nim决定了两者的适用场景delete(x, i)L2212删除后保持其余元素原有顺序代价是后续元素整体前移为 O(n)del(x, i)L1245把最后一个元素搬移到被删位置代价 O(1)但元素顺序会改变pop(s)L2039只移除并返回末尾元素是三者中唯一有返回值、且只作用于尾部的操作。var a [1, 2, 3, 4, 5] a.delete(0) # a [2, 3, 4, 5]保序O(n) var b [1, 2, 3, 4, 5] b.del(0) # b [5, 2, 3, 4]不保序O(1) let last b.pop() # last 4, b [5, 2, 3]如果元素顺序无关紧要例如只作为集合使用优先del以获得 O(1) 性能。切片语法速查x[a .. b]、x[a .. ^b]、x[a .. b]三种切片都返回新序列let s [0, 1, 2, 3, 4] s[1 .. 3] # [1, 2, 3] 两端包含 s[1 .. ^2] # [1, 2, 3] 上界用反向索引^1 是最后一个元素 s[1 .. 3] # [1, 2] 不包含上界^反向索引同样适用于字符串和数组是 Nim 的特色语法。延伸阅读lib/pure/sequtils.nim对容器含字符串的函数式操作map、filter、foldl等lib/pure/json.nim允许异构成员的JsonNode结构lib/pure/lists.nim链表singly/doubly linked list。集合set操作Nim 的内建集合是位集合bit set以位图方式存储成员必须来自序数类型。常用操作如下实现集中在 lib/system/setops.nim全部为编译器 magicIncl/Excl/Card/InSetProc用法incl(x, y)将元素y加入集合xexcl(x, y)将元素y从集合x中移除card(x)返回集合基数元素个数a * b交集a b并集a - b差集contains(x, y)判断元素是否在集合中a b判断a是否为b的真子集var s {a, c, e} # 字符集合位集合 s.incl(b) # s {a, b, c, e} s.excl(c) # s {a, b, e} assert card(s) 3 assert a in s # in 语法糖等价于 contains assert s {a, b, d, e} # 真子集判断集合操作符*、、-与数字乘法、加法、减法共享语法编译器会根据操作数类型自动区分——这也是 Nim 重载操作符设计的典型例子。延伸阅读lib/pure/setutils.nim位集合的便利函数lib/pure/sets.nim哈希集合HashSet成员类型不受序数限制lib/pure/intsets.nim面向int的高效整数集合。数字运算system内置整数除法、取模、移位、位运算与基础类型转换并给出其他语言中的常见对应写法便于对照Proc用法其他语言中的别名div整数除法//mod整数取模余数%shl左移shr右移ashr算术右移—and按位与or按位或\|xor按位异或^not按位取反补码~toInt将浮点数转换为int—toFloat将整数转换为float—assert 7 div 2 3 # 整数除法向零截断 assert 7 mod 2 1 # 余数 assert 1 shl 4 16 # 左移 4 位 assert -8 ashr 1 -4 # 算术右移符号位保留 assert 0b1100 and 0b1010 0b1000 assert 0b1100 or 0b1010 0b1110 assert 0b1100 xor 0b1010 0b0110 assert not 0u8 0xFFu8 # 按位取反 assert toInt(3.99) 3 # 浮点转整数截断见 [lib/system.nim](https://link.gitcode.com/i/7e6a3d0779069dbf2c898170b1732e2a#L1341) assert toFloat(3) 3.0 # 整数转浮点[lib/system.nim](https://link.gitcode.com/i/7e6a3d0779069dbf2c898170b1732e2a#L1322)需要注意toInt(float)是向零截断而非四舍五入且入参不能超出目标整数类型的表示范围。ashr算术右移与shr逻辑右移的区别在于对有符号负数ashr保留符号位而shr会补零。延伸阅读lib/pure/math.nim三角函数、对数、平方根/立方根等数学运算lib/pure/complex.nim复数运算lib/pure/rationals.nim有理数。序数类型Ordinal操作序数类型Ordinal定义见 lib/system.nim 的泛型约束包括整数、布尔、字符、枚举类型及其子类型。它们有一组共通的前后继操作Proc用法succ返回下一个值后继pred返回上一个值前驱inc自增dec自减high返回该类型的最高可能值low返回该类型的最低可能值ord返回序数值的int表示type Color enum red, green, blue assert succ(red) green assert pred(green) red var i 5 inc(i) # i 6 dec(i) # i 5 assert high(int8) 127i8 assert low(int8) -128i8 assert ord(A) 65high/low与len对数组high(T)-low(T)1配合是编写泛型容器代码时获取类型边界的标准手段。杂项类型判断、内存地址、区间与文档示例system还提供若干难以归入上述分类、但极其常用的语法设施Proc用法is判断两个参数是否为同一类型isnotis的否定形式!不等于addr取内存位置的地址and/or/xor/not布尔逻辑运算a[^x]取反向索引x处的元素a .. b构造闭区间[a, b]a ..^ b区间[a, b]但b为反向索引a .. b半开区间[a, b)runnableExamples创建可测试的文档示例其中与常规语言差异最大的两点反向索引^a[^1]即最后一个元素^后的数字从 1 开始计数。它与切片语法a[1 .. ^2]组合是处理相对尾部索引的最简洁写法且对字符串、数组、序列通用。区间构造符a .. b构造HSlice可直接用于切片..^与..分别对应反向索引上界与半开上界例如for i in 0 .. 10:是 Nim 中最常见的迭代区间写法。runnableExamples是 Nim 文档系统的特色写在 proc 文档注释里的示例代码会被nim doc提取并实际编译运行确保文档示例永不过期。上文len、ord、newSeq的实现注释中均带有这样的可运行示例见 lib/system.nim 等读者可以直接将它们复制到自己的测试中。如何继续深入本文的每张表格都只是system模块的常用子集完整的模块文档远不止这些函数。推荐的学习路径阅读源码实现本仓库的 lib/system.nim3267 行与 lib/system/ 目录下的子模块是权威事实来源每个公开函数的文档注释都附带runnableExamples可直接运行验证对照延伸模块按文中各节 See also 的指引依次阅读 lib/pure/strutils.nim、lib/pure/sequtils.nim、lib/pure/math.nim 等纯标准库模块它们构建在system之上是学习标准库分层设计的范本动手实验将本文代码片段保存为.nim文件用nim c -r编译运行注意delete/del的 O(n)/O(1) 取舍、newSeq的零值填充语义、cstring的len复杂度等细节都应在真实代码中反复验证。掌握system模块就等于掌握了 Nim 语言的底层词汇表——它是阅读一切标准库与第三方库代码的起点。赞分享编程语言编译器语言运行时标准库【免费下载链接】NimNim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).项目地址https://gitcode.com/gh_mirrors/ni/Nim点击查看免费下载相关推荐ControlNet-v1-1_fp16_safetensors多节点部署分布式系统中的模型配置ControlNet v1 1_fp16_safetensors多节点部署分布式系统中的模型配置 ControlNet v1 1_fp16_safetenso计算机视觉Tork架构深度解析揭秘高性能分布式任务调度原理Tork架构深度解析揭秘高性能分布式任务调度原理 Tork 是一款轻量级、高性能的分布式工作流引擎它通过将任务作为简单脚本在Docker容器中运行实现了高后端任务调度Redis Commander 核心功能详解管理字符串、列表、集合和有序集合Redis Commander 核心功能详解管理字符串、列表、集合和有序集合 Redis Commander 是一款基于 Node.js 开发的 Redis后端上一篇Frege 项目教程JVM上的Haskell编程语言下一篇TensorFlow YOLOv3 项目使用与部署教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考