Swift REPL:如何保存/加载 REPL 状态?(又名挂起/恢复、快照、克隆)



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

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

  • 此概念可能命名为保存/加载、挂起/恢复、快照/克隆、序列化/反序列化等。

任何让我实现这一目标的解决方案都会有所帮助,即使是像这样的黑客:

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

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

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

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

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

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

XCode 游乐场也有类似的功能,使用"保存",将内容外部化。

也许这会对你有所帮助。

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

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

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

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

顺便说一句,在那个临时文件夹中,repl.swift实际上比repl1.swift更紧凑.您可能想复制repl.swift .

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

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

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

例如,您可以执行以下操作:

  autoexpect -f myscript swift

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

  ./myscript

它将重播该届会议。

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

这似乎正是这些实用程序最初设计的目的,因此如果该功能尚不存在,我会感到惊讶。

其他类似的命令是 scriptinteract

最新更新