【问题标题】:Swift REPL: how to save/load the REPL state? (a.k.a. suspend/resume, snapshot, clone)Swift REPL:如何保存/加载 REPL 状态? (又名暂停/恢复、快照、克隆)
【发布时间】:2015-01-10 04:08:30
【问题描述】:

在 Swift REPL 中,有什么方法可以保留 REPL 状态?

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

  • 这个概念可能被命名为保存/加载、暂停/恢复、快照/克隆、序列化/反序列化等。

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

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

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

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

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

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

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

XCode Playgrounds 有一个类似的功能,使用“保存”,将内容外部化。

【问题讨论】:

  • 我怀疑 Swift 对此是否有任何支持(通常确实需要支持)。如果 REPL 在具有睡眠支持的 VM 内运行.. 但遗憾的是,这样的“图像”使 SmallTalk 几乎是独一无二的。我也不知道有任何基于进程的快照工具,但我没有看过。
  • 为什么不使用游乐场?
  • @huocp 因为 Swift REPL 很棒 - 根据我的经验,它比游乐场更快更轻。

标签: swift read-eval-print-loop


【解决方案1】:

也许这对你有一点帮助。

刚刚发现实际上 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

【讨论】:

  • 谢谢! Swift REPL 似乎在 FILE 目录中创建了许多文件。每个 REPL 命令似乎都创建了两个文件:一个 .swift 文件和一个 .cpp 文件。没有数字的 .swift 文件(“repl.swift”)似乎正在跟踪所有成功执行的 REPL 行。似乎没有办法将它重播到新的 REPL 中——接下来我会尝试找到它。
  • 如何处理文件以过滤掉所有 cmets,然后将剩下的内容传递给 swift 调用?
  • 这不再适用于 Swift 3.1。 __FILE__ 已重命名为 #file,它只会输出 repl.swift。但是,您可以使用 find /var/folders/ -name repl.swift 并查看匹配项。
【解决方案2】:

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

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

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

例如,你可以这样做:

  autoexpect -f myscript swift

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

  ./myscript

它会重播那个会话。

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

这似乎正是这些实用程序最初设计的目的,所以如果功能还没有,我会感到惊讶。

其他类似的命令有scriptinteract

【讨论】:

  • 这是一个很好的通用答案,因为 expect 命令和 script 命令对许多其他目标非常有用 - 感谢您向我介绍这些目标!
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2020-10-08
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多