在Swift REPL中,保存REPL状态的方法是什么?
例如,我想在REPL中做一大堆工作,然后保存,以便稍后加载。
此概念可能被命名为save / load,suspend / resume,snapshot / clone,serialize / deserialize等。
任何解决这个问题的解决方案都会有所帮助,即使它是这样的黑客攻击:
记录所有历史记录行,然后在另一个REPL中重播它们。
序列化所有对象,然后在另一个REPL中反序列化它们。
快照RAM或VM,然后将其克隆到另一台计算机。
保存全局状态的核心图像,然后稍后执行。
我的目标是在一台机器上保存REPL工作,然后将其加载到另一台机器上。
我只需要最终状态;我不需要堆栈,历史或句柄等。
XCode Playgrounds具有类似的功能,使用" Save",外化内容。
答案 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的最终命令。我不确定是否有办法运行脚本,以便省略该命令,并将控制权传递给您。
这看起来就像这些实用程序最初设计的那样,所以如果功能尚未存在,我会感到惊讶。
其他类似的命令是script
和interact
。