Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift REPL:如何保存/加载REP状态?(也称为挂起/恢复、快照、克隆)_Swift_Read Eval Print Loop - Fatal编程技术网

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

Swift REPL:如何保存/加载REP状态?(也称为挂起/恢复、快照、克隆),swift,read-eval-print-loop,Swift,Read Eval Print Loop,在Swift REPL中,保存REPL状态的方法是什么 例如,我想在REPL中做一些工作,然后保存它,以便以后加载它 这个概念可能被命名为保存/加载、挂起/恢复、快照/克隆、序列化/反序列化等 任何能让我做到这一点的解决方案都会有所帮助,即使是这样的黑客: 记录所有历史记录行,然后在另一个REPL中重播它们 序列化所有对象,然后在另一个REPL中反序列化它们 快照RAM或VM,然后将其克隆到另一台计算机 保存全局状态的核心映像,然后稍后执行 我的目标是在一台机器上保存REPL工作,然后在

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

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

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

任何能让我做到这一点的解决方案都会有所帮助,即使是这样的黑客:

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

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

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

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

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

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


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
查找匹配项。