你那句"整个语言就表和元表两样东西",诚然不假,然则极简是把复杂度从语言挪到了使用者肩上。
最典型的就是 OOP。Lua 没给你 class,得拿 metatable 的 __index 自己搭。这确实逼你把结构想清楚,代价却是十个项目十种写法——有的用闭包当构造器,有的走原型链,有的照 PiL 书上的套路。所谓"干净",大抵是没统一约定造成的错觉,并非语言替你做了收敛。接手别人写的 Lua 配置,光弄懂他那套 object 模型就够喝一壶。
embed 这块我也服。C API 是真克制,lua_State 一个句柄走天下,往宿主里塞几乎零摩擦。不过得提醒:正因太好嵌,安全边界得自己划。配置若允许用户上传,默认带着 os.execute、io、load 这套,等于直接开了个 shell。OpenWrt 和不少游戏引擎上线前都得先把标准库卸掉一截,只留想要的那块。这活儿 Lua 不替你干。
简单说性能上泼点冷水。图轻量真跑重逻辑还得靠 LuaJIT,PUC-Rio 那版慢得不是一个量级。可 LuaJIT 基本停在 5.1 语义,5.2 后的 goto、整数子类型、__pairs 一概不跟。等于"轻量"和"跟新特性"得二选一,这坑当初选型时挺隐蔽。
话说你平时拿 Lua 主要配什么?Neovim 那套我也在用,但越写越像个小型 DSL。有时候反倒觉得"主语是我"这话得打个问号,语言跑着跑着就又冒头了。你一般写到什么规模会开始觉得它反过来拽你?