IronSchemeエンジンを「リセット」する方法はありますか?私は基本的に、string.Eval()への連続した呼び出しが独立して実行されるようにすることを目指しています。
たとえば、実行したい
"(define x 1.0) (+ x 5.0)".Eval()
その後、リセットして、電話をかけます
"(+ x 3.0)".Eval()
単独で実行された場合と同じように失敗します。
さらに良いのは、n個の同時スレッドのそれぞれに実行するための独自の独立したスペースを与える方法です。
IronSchemeエンジンを「リセット」する方法はありますか?私は基本的に、string.Eval()への連続した呼び出しが独立して実行されるようにすることを目指しています。
たとえば、実行したい
"(define x 1.0) (+ x 5.0)".Eval()
その後、リセットして、電話をかけます
"(+ x 3.0)".Eval()
単独で実行された場合と同じように失敗します。
さらに良いのは、n個の同時スレッドのそれぞれに実行するための独自の独立したスペースを与える方法です。
REPLには2つのオプションがあります(ライブラリを使用すると、そのようなコードを記述できなくなります; p)。
1:インタラクション環境をリセットします。
これはで行うことができます(interaction-environment (new-interaction-environment))
。
サンプル:
> (define x 5) (+ x 5)
10
> (interaction-environment (new-interaction-environment))
> (+ x 5)
Unhandled exception during evaluation:
&undefined
&message: "attempted to use undefined symbol"
&irritants: (x)
2:C#で保持する新しい対話環境を作成します。
並行環境が必要な場合は、これがおそらく最良のオプションです。私はこのアプローチをIronSchemeオンラインエバリュエーターに使用します。
サンプル:
"(define x 1.0) (+ x 5.0)".Eval();
var env = "(new-interaction-environment)".Eval();
"(+ x 3.0)".EvalWithEnvironment(env);
考えられる解決策:
Func<object> reset =
"(lambda () (interaction-environment (new-interaction-environment)))".
Eval<Callable>().Call;
"(define x 1.0) (+ x 5.0)".Eval();
reset();
"(+ x 5.0)".Eval();