3

プログラミング以外のユーザーのために、既存の .Net アプリケーションをスクリプト可能にしています。ルアを追加しました。これは魅力のように機能します。次に、debug.sethook を介してデバッグ機能 (一時停止/続行/ステップ)を追加しました。それは魅力のようにも機能します。

今、私のアプリケーションには、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.cspublic Ast.Block ParseString(string Chunk)には、最初に生成される parseTree があります。parseTree.tokens[i].locations には、各トークンの正確な位置が含まれています。はIrony.Parsing.ParseTree再度解析されて に変換されますNetLua.Ast.Blockが、位置情報は欠落しています。これを変更する必要があるので、後でどのステートメントがどの行にあるかがわかります。
  3. AST ツリーの各ステートメントは、EvalBlock を介して直接実行されます。デバッグ機能 (C Binding lua Interpreter DynamicLua に debug.setHook を介して持っているようなもの) を追加する必要があります。これは LuaInterpreter.cs internal static LuaArguments EvalBlock(`. Pause/continue/step 関数で問題ありません。各ステートメントには位置行情報が含まれているため、現在の行の強調表示を追加することもできます。
  4. 実行が一時停止され、コードが編集されると、現在の LuaContxct が保存されます。すべての変数が含まれています。また、最後の実行行を持つ最後のステートメントも保存されます。
  5. ここで、コード文字列が再度解析されて新しい AST ツリーになります。実行されます。ただし、行ステートメントを含む保存済みステートメントに到達するまで、すべてのステートメントはスキップされます。保存されたLuaContextものが復元され、すべての変更を適用して実行を続行できます。

新しいNetLua.Ast.Assignmentステートメントは現在の LuaContext に新しい変数を追加するだけで、すべてが正常に機能するため、最後に実行された行の後に新しい変数を追加することもできます。

これは機能しますか?

4

1 に答える 1