3

这听起来像是一个愚蠢的问题,但我看不到任何地方提到这个特定问题。基本上:

我想逐行执行 Lua 脚本,主要是为了能够随时随地暂停/恢复执行。我所做的很简单:用 luaL_loadbuffer() 加载一个块,然后发出一个 lua_pcall()。

事情是......我怎样才能正确检测 Lua 块以便原子地执行它们?

例如,假设脚本中有一个函数——通过使用上述方法逐行执行文件,我似乎无法正确识别该函数,因此它的内容被加载并调用一个。

我可以想象一个解决方案是手动处理一个堆栈,我在其中推送我可以在脚本中识别的控制关键字(“function”、“if”、“do”等)以及它们相应的“end”子句(如果我发现嵌套)块。一旦我推动最后的“结束”,我就会调用整个街区,但这听起来很糟糕。当然,必须有更好的方法来做到这一点。

希望它有一些意义,谢谢!

4

2 回答 2

1

使用lua_sethook()

请注意,您可能确实想试验您需要的确切挂钩调用粒度。我建议改为执行字节码指令块。一条很长的行可能包含许多指令。

于 2011-03-22T23:26:40.417 回答
1

请查看Lua coroutines以实现该功能以编写游戏实体的脚本。这个想法是在你提到的 sleep() 和 waitforevent() 例程中产生协程,然后稍后恢复(例如在超时或事件发生后)。

于 2011-03-23T13:50:25.603 回答