Lua 5.4 · Powered by JavaScript
在浏览器里运行 Lua
一个用纯 JavaScript 从零实现的 Lua 解释器:词法分析、语法树、元表、协程、模式匹配, 不需要后端,也不需要安装任何东西。打开页面,写代码,按 Ctrl + Enter。
零依赖
完全离线
元表 / 协程
Lua 模式匹配
main.lua
Ctrl/⌘ + Enter 运行 · Tab 缩进
0 行
点击「运行」或按 Ctrl/⌘ + Enter 执行代码。print 的输出会显示在这里。
调用栈
每行一条输入,供 io.read() 读取。例如输入 42 后,Lua 中 io.read("n") 就会得到 42。
完整核心语法
变量、闭包与 upvalue、可变参数、多返回值、goto/label、<const>、数值与泛型 for,语法覆盖 Lua 5.4 的主要部分。
元表与面向对象
__index、__newindex、__call、__add、__tostring、__eq 等元方法齐全,可以直接写 class、继承和运算符重载。
真正的协程
求值器基于 JavaScript generator 构建,coroutine.yield 可以跨越嵌套函数、pcall、table.sort、gsub 回调挂起和恢复。
Lua 模式匹配
独立实现的 Lua pattern 引擎:字符类、集合、捕获、位置捕获、反向引用、%b 平衡匹配与 %f 边界,不是简单替换成正则。
已实现的标准库
- base print, type, tostring, tonumber, ipairs, pairs, next, select, assert, error, pcall, xpcall, load, rawget/rawset, setmetatable/getmetatable
- string len, sub, byte, char, rep, reverse, upper, lower, format, find, match, gmatch, gsub
- table insert, remove, concat, sort, unpack, pack, move
- math abs, ceil, floor, sqrt, fmod, modf, max, min, random, randomseed, tointeger, type, 三角函数与常量
- coroutine create, resume, yield, status, wrap, running, isyieldable, close
- os / io / utf8 os.time, os.date, os.clock, os.difftime;io.write, io.read;utf8.char, utf8.len, utf8.codepoint, utf8.codes
- debug traceback, getmetatable, setmetatable
实现说明与差异
整个解释器约 4000 行 JavaScript,分为词法分析、递归下降解析器、树遍历求值器和标准库四层。协程直接复用 JS generator,因此 yield 可以穿过任意深度的 Lua 调用。
| 项目 | 说明 |
|---|---|
| 数字 | 统一使用双精度浮点,没有独立的 64 位整数子类型;2/1 显示为 2 而非 2.0,超出 253 的整数会损失精度;位运算通过 BigInt 模拟 64 位 |
| 字符串 | 按 UTF-16 索引,中文按字符处理,string.char 接受 Unicode 码点;Lua 原生按字节索引,string.char 只接受 0–255 |
| 文件 IO | 浏览器不提供文件系统,io.read 从页面的「标准输入」读取,io.write 写入输出面板 |
| 模块 | 没有 require / package;可用 load 动态执行代码 |
| 递归 | 普通递归受 JavaScript 调用栈限制,约 200 层;尾调用 return f(...) 会复用栈帧,可无限递归 |
| 其他 | 不支持 <close>、__gc、string.pack;goto 不做局部变量作用域的静态检查 |
小技巧
print 会用制表符分隔多个值;表和函数默认显示地址。用
string.format("%q", s) 查看字符串的转义形式。按下「分享」会把代码放进 URL hash,发给别人打开即可看到同一段代码。
死循环会被自动中断:默认上限约 300 万步 / 5 秒。
评论与讨论
评论保存在 GitHub Issues,登录 GitHub 后即可参与讨论。
评论暂未开放,站点管理员尚未配置 GitHub OAuth。
前往 GitHub Issues