已完成当前这一轮。
这一轮继续沿着基础库主线补最常用的转换函数,把 tonumber 和 tostring 接到了当前运行时主线上。
这一轮主要参考这些官方文件:
references/lua-5.5.0/src/lbaselib.creferences/lua-5.5.0/src/lauxlib.creferences/lua-5.5.0/src/ltm.c- Lua 5.5 手册:https://www.lua.org/manual/5.5/
这一轮关注的核心点是:
luaB_tonumberluaB_tostringluaL_tolstring__tostring__name
本轮先落这几件事:
- 在
_ENV中预置tonumber - 在
_ENV中预置tostring - 让
tonumber支持一参标准转换和二参进制转换 - 让
tostring支持__tostring元方法 - 让
tostring支持 table / userdata metatable 上的__name - 用真实 Lua 5.5 chunk 验证这组函数的 Lua 层行为
这一轮没有只做“十进制字符串转数字”这种最窄实现,而是把 Lua 层最常见的几条路径一起补了:
- 已经是 number 的值原样返回
- 十进制整数和浮点字符串
- 十六进制整数与十六进制浮点字符串
tonumber(s, base)的进制整数转换
这样后面即使还没开始做更大的标准库,这组最常见的数值入口也已经能直接用了。
Lua 里的 tostring 不只是简单打印类型名。
这一轮把最关键的两条语义补上了:
- 有
__tostring时,先调用元方法 - 没有
__tostring时,再走默认格式化
默认格式化也补上了 __name,所以 table / userdata 现在可以打印出更接近 Lua 的 name: 0x... 形式。
这一轮没有让 tostring 单独绕开运行时,而是继续复用当前统一 callable 入口去调用 __tostring。
这样 table / userdata 上的 __tostring 和前面已经接好的最小 callable 路径是同一条链,后面继续补元方法时不用拆第二套逻辑。
这一轮新增支持:
_ENV.tonumber_ENV.tostringtonumber(number)原样返回tonumber(string)的十进制整数 / 浮点转换tonumber(string)的十六进制整数 / 十六进制浮点转换tonumber(string, base)的 2 到 36 进制整数转换tostring的基础值格式化tostring的__tostring元方法路径tostring的__name类型名路径
当前这一轮还没有展开的是:
next/pairs/ipairs(已拆到docs/030-step-07-table-iteration-functions.md)print/warn(已拆到docs/031-step-07-print-warn-functions.md)- 更完整的 traceback 与调试信息
- 更系统的标准库模块拆分
这一轮新增 fixture:
test/fixtures/lua55/source/tonumber_chunk.luatest/fixtures/lua55/chunks/tonumber_chunk.luactest/fixtures/lua55/source/tostring_chunk.luatest/fixtures/lua55/chunks/tostring_chunk.luac
它们分别覆盖:
- 十进制、十六进制、十六进制浮点和进制整数转换
- 转换失败时返回
nil tostring(3.0)的浮点格式__tostring返回自定义字符串__name影响默认对象显示名- 函数对象的默认格式化
- 编写本轮文档
- 在
_ENV中注册tonumber - 在
_ENV中注册tostring - 为
tonumber增加一参标准转换 - 为
tonumber增加二参进制转换 - 为
tostring增加__tostring元方法路径 - 为
tostring增加__name显示名路径 - 新增对应运行时测试
- 新增对应真实 fixture
- 新增对应 VM 测试
本轮完成后,应满足:
- Lua 层可以直接调用
tonumber/tostring - 真实 Lua 5.5 chunk 可以覆盖常见转换路径
tostring已经能和当前元方法路径协作- 十进制、十六进制和进制整数转换都有测试钉住
接下来继续往下补:
nextpairsipairs- 更完整的错误处理与 traceback
- 更系统的标准库模块拆分