Swift REPL:如何保存/加载REPL状态? (a.k.a.暂停/恢复,快照,克隆)

时间:2015-01-10 04:08:30

标签: swift read-eval-print-loop

在Swift REPL中,保存REPL状态的方法是什么?

  • 例如,我想在REPL中做一大堆工作,然后保存,以便稍后加载。

  • 此概念可能被命名为save / load,suspend / resume,snapshot / clone,serialize / deserialize等。

任何解决这个问题的解决方案都会有所帮助,即使它是这样的黑客攻击:

  • 记录所有历史记录行,然后在另一个REPL中重播它们。

  • 序列化所有对象,然后在另一个REPL中反序列化它们。

  • 快照RAM或VM,然后将其克隆到另一台计算机。

  • 保存全局状态的核心图像,然后稍后执行。

我的目标是在一台机器上保存REPL工作,然后将其加载到另一台机器上。

我只需要最终状态;我不需要堆栈,历史或句柄等。

XCode Playgrounds具有类似的功能,使用" Save",外化内容。

2 个答案:

答案 0 :(得分:3)

也许这可以帮助你一点。

实际上发现Swift REPL将当前会话保存在文件中。

在REPL中输入__FILE__,您将看到会话文件。

  1> __FILE__
$R0: String = "/var/folders/6j/xs_0g88d55dgprjrwdws898w0000gn/T/lldb/3869/repl1.swift"

您可以查看文件内容,它会一直跟踪当前的REPL会话。 我相信您可以构建一行Swift代码将该文件复制到您的保存文件夹中,您必须在会话结束时运行该文件夹。

BTW,在那个临时文件夹中,repl.swift实际上比repl1.swift更紧凑。您可能想要复制repl.swift

答案 1 :(得分:1)

您可以尝试使用经典命令行实用程序expect

expect重播基于文本的交互脚本,观察预期的响应。当然,这需要您编写一个期望脚本。

但是,如果您从软件包管理器(如MacPorts)安装expect,那么它还将安装命令autoexpect,它可以监视您的击键并自动生成expect脚本。

例如,你可以这样做:

  autoexpect -f myscript swift

然后在repl上进行交互,并在完成后退出。然后你可以做

  ./myscript

它将重播该会话。

问题? autoexpect将生成一个脚本,其中包含关闭REPL的最终命令。我不确定是否有办法运行脚本,以便省略该命令,并将控制权传递给您。

这看起来就像这些实用程序最初设计的那样,所以如果功能尚未存在,我会感到惊讶。

其他类似的命令是scriptinteract