Racket提供了创建sandboxed evaluators的工具。假设我有一个沙箱评估器,如何将其状态保存到文件中(例如(save-evaluator my-evaluator "my-evaluator.save")
,关闭我的计算机,第二天再回来,并加载评估器,以便我从我离开的地方恢复?
我查看了racket/serialize
,但沙盒评估程序不是可序列化的对象。我能想到的另一个解决方案是以某种方式拯救"环境" (即变量和过程绑定),并在我准备恢复时以某种方式将它们加载到新的求值器中。
任何解决方案或指针?
答案 0 :(得分:2)
简短的回答是......你做不到。
沙箱的评估程序状态包含太多要序列化的信息,而基本上没有捕获整个操作系统的快照。
因此,当您可以在虚拟机中评估您的程序并使用其保存机制时,我怀疑这对您实际需要的内容来说太过分了。因此,可能有一些解决方案可以满足您的需求。
最简单的一个是网络服务器的serializable continuations。这些基本上可以通过限制您实际可以序列化的Racket子集来实现。
另一个(更多手动)选项是自己处理序列化。显然,这是更多工作,但可以让您更好地控制要序列化的内容。请注意,您只能存储环境,而不能(可能是本地)继续存储。我将采用的方法是获取沙箱的命名空间,并使用它来获取namespace-mapped-symbols
的相应环境。然后,您可以使用racket/serialize
库来序列化该环境中的每个值。