我正在为非编程用户制作现有的.Net Application Scriptable。我添加了lua,它就像一个魅力。然后我通过debug.sethook添加了debug functionality(pause/continue/step)。它也像一个魅力。
现在我意识到我的应用程序需要编辑并继续使用Visual Studio这样的功能。暂停执行可以编辑代码,然后从应用更改的当前状态继续。这个功能对我来说非常重要。我认为这对脚本语言来说很容易。
我读到的任何地方脚本语言都可以做到这一点。但即使经过数小时的搜索,我还没有找到Lua的实现。它不是Lua,但Lua中的热交换代码将是我的首选。
如何提供用户暂停和编辑脚本的能力,而不是继续执行更改?
注意:它不一定是Lua每个脚本语言都可以
更新
@Schollii 这是一个例子:
function doOnX()
if getValue() == "200" then
value = getCalculation()
doSomething() -- many function calls, each can take about 2s
doSomething()
doSomething()
print(value)
doX(value)
end
end
doOnX()
感谢您的建议。这是它的工作方式:
public Ast.Block ParseString(string Chunk)
中,首先生成一个parseTree。 parseTree.tokens [i] .locations包含每个标记的确切位置。然后再次解析Irony.Parsing.ParseTree
并转换为NetLua.Ast.Block
,但遗漏了位置信息。我需要更改它,以便稍后我会知道哪个Statement在哪一行。LuaContext
,并且可以继续执行所有更改。也可以在最后执行的行之后添加新变量,因为新的NetLua.Ast.Assignment
语句可以只向当前的LuaContext添加一个新变量,一切都应该正常工作。
这会有用吗?
答案 0 :(得分:2)
我认为这样做是非常具有挑战性和挑战性的。
可能你唯一能做的就是完全重新编译代码块。在函数中,这将意味着整个函数,无论编辑在何处起作用。然后再次调用该函数。显然,该功能必须是可重入的,否则其副作用(如增加全局值或升值值)必须撤消,这是不可能的。如果它不是可重入的,它仍然可以工作,只是不给出预期的结果(例如,如果函数将全局变量增加1再次调用它将导致全局变量在函数最终返回后增加2)。
但是,如果真正的通用解决方案,在脚本中找到chunknstarts和end的行将是棘手的。对于特定的解决方案,您必须发布要运行的脚本的特定示例以及您想要编辑的行的示例。如果整个用户脚本被重新编译并重新运行,那么这不是问题,但副作用仍然是一个问题,示例也可以帮助那些。