Swift REPL:如何保存/加载REP状态?(也称为挂起/恢复、快照、克隆)
在Swift REPL中,保存REPL状态的方法是什么Swift REPL:如何保存/加载REP状态?(也称为挂起/恢复、快照、克隆),swift,read-eval-print-loop,Swift,Read Eval Print Loop,在Swift REPL中,保存REPL状态的方法是什么 例如,我想在REPL中做一些工作,然后保存它,以便以后加载它 这个概念可能被命名为保存/加载、挂起/恢复、快照/克隆、序列化/反序列化等 任何能让我做到这一点的解决方案都会有所帮助,即使是这样的黑客: 记录所有历史记录行,然后在另一个REPL中重播它们 序列化所有对象,然后在另一个REPL中反序列化它们 快照RAM或VM,然后将其克隆到另一台计算机 保存全局状态的核心映像,然后稍后执行 我的目标是在一台机器上保存REPL工作,然后在
- 例如,我想在REPL中做一些工作,然后保存它,以便以后加载它
- 这个概念可能被命名为保存/加载、挂起/恢复、快照/克隆、序列化/反序列化等
- 记录所有历史记录行,然后在另一个REPL中重播它们
- 序列化所有对象,然后在另一个REPL中反序列化它们
- 快照RAM或VM,然后将其克隆到另一台计算机
- 保存全局状态的核心映像,然后稍后执行
XCode操场有一个类似的功能,使用“保存”,它将内容外部化。也许这会对您有所帮助 刚刚发现实际上Swift REPL将当前会话保存在一个文件中 在REPL中键入
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
1> __FILE__
$R0: String = "/var/folders/6j/xs_0g88d55dgprjrwdws898w0000gn/T/lldb/3869/repl1.swift"
您可以查看文件内容,它会跟踪当前的REPL会话。
我相信您可以构建一行Swift代码,将该文件复制到您的保存文件夹中,您必须在会话结束时运行该文件夹
顺便说一句,在那个临时文件夹中,repl.swift
实际上比repl1.swift
更紧凑。您可能想要复制repl.swift
您可以尝试使用经典的命令行实用程序expect
expect
回放基于文本的交互脚本,观察预期的响应。当然,这需要您编写一个expect脚本
但是,如果您从软件包管理器(如MacPorts)安装expect,那么它还将安装命令autoexpect
,该命令可以监视您的击键并自动生成expect
脚本
例如,您可以执行以下操作:
autoexpect -f myscript swift
然后在repl上进行交互,完成后退出。那以后你就可以做了
./myscript
它将重播该会话
问题出在哪里autoexpect
将生成一个脚本,其中包含关闭REPL的最终命令。我不确定是否有办法运行脚本,使其忽略该命令,并将控制权移交给您
这似乎正是这些实用程序最初设计的目的,因此如果功能还没有实现,我会感到惊讶
其他类似的命令有script
和interactive
我怀疑Swift对此是否有任何支持(而这类命令通常需要支持)。如果REPL是在支持睡眠的VM内运行的。。但遗憾的是,这样的“图像”使SmallTalk几乎成为独一无二的。我也不知道有任何基于流程的快照工具,但我还没看过。为什么不使用游乐场?@huocp因为Swift REPL很棒-以我的经验,它比游乐场更快更轻。这是一个很好的通用答案,因为expect
命令和script
命令对许多其他目标都非常有用-谢谢你向我介绍这些!谢谢Swift REPL似乎正在文件目录中创建许多文件。每个REPL命令似乎创建两个文件:一个.swift文件和.cpp文件。没有编号的.swift文件(“repl.swift”)似乎正在跟踪成功执行的所有repl行。似乎没有办法将其重播到新的REPL中——我将在下一步尝试找到它。如何处理该文件以过滤掉所有注释,然后将剩下的内容传输到swift调用中?这在swift 3.1中不再起作用<代码>\uuuu文件
已重命名为\35;文件
,它将只输出repl.swift
。但是,您可以使用find/var/folders/-name repl.swift
查找匹配项。