基于 Lua 的模拟环境
··Rratic
介绍
一直以来都有一个横亘在我们眼前的难题,即如何弥合现实(这里指现实的离散、抽象部分)与模拟之间的鸿沟。
曾经语言学家认为可以通过设定规则把自然语言处理(Natural Language Processing)做好,然而对比统计方法,尽显其弊端:复杂性使规则难以穷举、歧义会引入新的复杂性、成本过高(如欧盟的 Eurotra 项目)。
然而我们有时还是希望确保一个模拟系统的准确性(我认为对于分而治之、菱形继承问题的处理、ECS 架构等等思想部分体现了这一点),乃至探讨引入特殊的、不同优先级规则的结果,因而我还是希望去逐步地设计一个这样的框架。
这个过程必然不是一蹴而就的,而且并不是封闭的,因此它必须有足够的灵活性。
我认为 Lua 具有相当的优势:
- 优雅
- 语法可以简单地讲清
- 函数是一等公民
- 有足够的灵活性,主要体现在动态类型和
table
- 没有原生的类,但可以通过
setmetatable
等模拟 - 模块化的最佳实践也使用
table
- 没有原生的类,但可以通过
- LuaJIT 足够快,相比 js 来说,提供原生整数类型更易令人接受
- 作为一个广泛存在的插件语言有足够的支持
技术
使用了 fengari-web 直接加载嵌入在页面中的代码,它是基于 Lua 虚拟环境 Fengari 和额外的 js 和 DOM 接口 fengari-interop。其支持的版本是 Lua 5.3。
未来可能会采用 Rust + tauri 作为桌面端的渲染基础。
陈设
可以通过命令栏在虚拟环境中运行 Lua 代码。虚拟环境提供的唯一模块接口是 commands
。
特别地,使用 /preload
注册的代码会在完整的环境(即 _ENV
)中运行。
以 /
开头的命令,如 /help
,会被自动替换为 commands.help:run()
。
此外,提供了快捷键和亮暗色模式(跟随整个站点的设置 localStorage["linkita-color-scheme"]
)。
API
暂不提供文档,希望自行阅读源代码。
由于进行了模块化(尽管还不够完全),你可以随意地编写 mod 带来翻天覆地的改变,然后放到 preload
中。