如何保存和恢复Racket沙盒评估器的状态?

时间:2018-03-08 04:19:51

标签: scheme racket

Racket提供了创建sandboxed evaluators的工具。假设我有一个沙箱评估器,如何将其状态保存到文件中(例如(save-evaluator my-evaluator "my-evaluator.save"),关闭我的计算机,第二天再回来,并加载评估器,以便我从我离开的地方恢复?

我查看了racket/serialize,但沙盒评估程序不是可序列化的对象。我能想到的另一个解决方案是以某种方式拯救"环境" (即变量和过程绑定),并在我准备恢复时以某种方式将它们加载到新的求值器中。

任何解决方案或指针?

1 个答案:

答案 0 :(得分:2)

简短的回答是......你做不到。

沙箱的评估程序状态包含太多要序列化的信息,而基本上没有捕获整个操作系统的快照。

因此,当您可以在虚拟机中评估您的程序并使用其保存机制时,我怀疑这对您实际需要的内容来说太过分了。因此,可能有一些解决方案可以满足您的需求。

最简单的一个是网络服务器的serializable continuations。这些基本上可以通过限制您实际可以序列化的Racket子集来实现。

另一个(更多手动)选项是自己处理序列化。显然,这是更多工作,但可以让您更好地控制要序列化的内容。请注意,您只能存储环境,而不能(可能是本地)继续存储。我将采用的方法是获取沙箱的命名空间,并使用它来获取namespace-mapped-symbols的相应环境。然后,您可以使用racket/serialize库来序列化该环境中的每个值。