脚本语言用"编辑并继续"或者"热插拔"支持? (也许在Lua可能吗?)

时间:2014-10-04 09:59:09

标签: scripting lua scripting-language hotswap edit-and-continue

我正在为非编程用户制作现有的.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() 

感谢您的建议。这是它的工作方式:

  1. 我将使用https://github.com/frabert/NetLua这是一个非常酷,写得很好的100%C#Lua口译员。它首先生成一个AST树,然后直接执行它。
  2. 需要修改解析器。在Parser.cs public Ast.Block ParseString(string Chunk)中,首先生成一个parseTree。 parseTree.tokens [i] .locations包含每个标记的确切位置。然后再次解析Irony.Parsing.ParseTree并转换为NetLua.Ast.Block,但遗漏了位置信息。我需要更改它,以便稍后我会知道哪个Statement在哪一行。
  3. 现在,AST树中的每个Statement都是通过EvalBlock直接执行的。需要添加调试功能(就像我在C Binding lua Interpreter DynamicLua中通过debug.setHook)。这可以在LuaInterpreter.cs内部静态LuaArguments EvalBlock(`。暂停/继续/步骤函数应该没问题。我现在也可以添加当前行突出显示,因为每个语句包含位置线信息。
  4. 暂停执行并编辑代码时,将保存当前的LuaContxct。它包含所有变量。还保存了最后一个执行行的最后一个语句。
  5. 现在,代码String再次被解析为新的AST树。它被执行了。但是跳过所有语句,直到达到带有line语句的已保存语句。已恢复保存的LuaContext,并且可以继续执行所有更改。
  6. 也可以在最后执行的行之后添加新变量,因为新的NetLua.Ast.Assignment语句可以只向当前的LuaContext添加一个新变量,一切都应该正常工作。

    这会有用吗?

1 个答案:

答案 0 :(得分:2)

我认为这样做是非常具有挑战性和挑战性的。

可能你唯一能做的就是完全重新编译代码块。在函数中,这将意味着整个函数,无论编辑在何处起作用。然后再次调用该函数。显然,该功能必须是可重入的,否则其副作用(如增加全局值或升值值)必须撤消,这是不可能的。如果它不是可重入的,它仍然可以工作,只是不给出预期的结果(例如,如果函数将全局变量增加1再次调用它将导致全局变量在函数最终返回后增加2)。

但是,如果真正的通用解决方案,在脚本中找到chunknstarts和end的行将是棘手的。对于特定的解决方案,您必须发布要运行的脚本的特定示例以及您想要编辑的行的示例。如果整个用户脚本被重新编译并重新运行,那么这不是问题,但副作用仍然是一个问题,示例也可以帮助那些。