大家好!
这是我最近一直在开发的项目,用于更好地了解解释器。
项目名为GMLVM,一款功能齐全的(几乎)GML解释器,使用纯GML编写并在GML中运行。
它能做什么?
它可以将GML代码转换为字符串,自增结构和其他(可选)结构,并在运行时像原生代码一样运行。可以想象成像execute_string或eval(从JS)。
它为你提供了在游戏中添加模组化功能的机会,而不强制玩家构建外部DLL或处理复杂的LUA绑定。
主要特性
- 完全语法支持:循环(
for、while、do/until),条件语句,switch,try/catch/finally,以及现代操作符(??)。 - 数据结构:支持数组,结构和
[? ].map/[| ]列表访问。 - 函数及闭包:第一级函数,递归和良好的词法范围(闭包按照预期运行)。
- 构造函数及继承:
new关键字和: Parent()构造函数继承。 - 模板字符串:
$"Hello {name}!"可以直接使用。 - 宏:
#macro支持常量。 - ...还有更多其他特性。
在未来的开发中,我想添加沙盒和调试功能,但目前我开发了一种定制的错误消息,优于GameMaker的错误消息。
https://preview.redd.it/hgg1znumguwg1.png?width=541&format=png&auto=webp&s=23fb48bf0096b2b4a01d5548949e377494de9a15
下面是一段代码示例:
gmlvm_init(); // 初始化
result = gmlvm_run(@"
var a = 20;
var b = 50;
var c= a + b;
show_debug_message($'and we got {c}'); // 你甚至可以使用函数或变量,在代码字符串外面,可以参考上述它在运行时像原生代码一样运行
return c; // 可选, 你不必返回任何东西
");
show_debug_message($"the addition result is {result}");
但如果将此调用在每帧执行,会消耗过多的性能,因此如果这种情况存在,我们也提供了两步执行:gmlvm_parse_only,它会将代码转换为AST,然后我们可以再次调用gmlvm_vm来运行它.
请注意,该项目仍在开发中,而且可能还有大量的 Bugs,即使它通过了100多个测试。
Github: https://github.com/erkan612/GMLVM
对本项目的建议和问答都心领神会,感谢你阅读!
评论 (0)