2015-01-10 2 views
5

Swift REPLでは、REPL状態を保持する方法は何ですか?Swift REPL:REPL状態を保存/ロードする方法は? (a.k.a. suspend/resume、snapshot、clone)

  • は例えば、私は、REPLでの作業の束を行い、それを保存したいので、私は後でそれを読み込むことができます。この概念は、負荷、サスペンド/レジューム、スナップショット/クローン/保存指名されるかもしれません

  • 、シリアライズ/デシリアライズなど

これに向かって私を取得する任意の解決策は、それがハックだ場合でも、助けます

  • すべての履歴行を記録し、別のREPLで再生します。

  • すべてのオブジェクトをシリアル化し、別のREPLで逆シリアル化します。

  • RAMまたはVMをスナップショットし、別のマシンに複製します。

  • グローバル状態のコアイメージを保存し、後で実行します。

私の目標は、REPL作業を1台のマシンに保存し、別のマシンにロードすることです。

私は最終状態のみが必要です。スタック、履歴、ハンドルなどは必要ありません。

XCodeプレイグラウンドは、コンテンツを外部化する「保存」機能を使用して同様の機能を備えています。

+0

私はSwiftがこれをサポートしているのか疑いがあります(一般的に*サポートが必要です)。 REPLがスリープサポート付きのVMの中で実行されていたのですが、残念なことに、このような「イメージ」がSmallTalkをほとんど一種類のものにしています。また、プロセスベースのスナップショットツールも認識していませんが、私は見ていません。 – user2864740

+0

なぜ遊び場を使用しないのですか? – huocp

+0

@huocp Swift REPLは素晴らしいので、私の経験では、遊び場よ​​りも速くて軽いです。 – joelparkerhenderson

答えて

3

多分、これは少しあなたを助けるかもしれません。

実際にSwift REPLが現在のセッションをファイルに保存していることがわかりました。

タイプ__FILE__ REPLには、セッションファイルが表示されます。

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

現在のREPLセッションを追跡しながらファイル内容を表示できます。 私はあなたがあなたのセッションの終わりに実行しなければならないあなたの保存フォルダにそのファイルをコピーする1行のSwiftコードを構築できると確信しています。

ところで、その一時フォルダでは、repl.swiftは実際にはrepl1.swiftよりもコンパクトです。おそらくrepl.swiftをコピーしたいと思うでしょう。

+0

ありがとう! Swift REPLは、__FILE__ディレクトリに多数のファイルを作成しているようです。各REPLコマンドは、.swiftファイルと.cppファイルの2つのファイルを作成しているようです。番号なしの.swiftファイル( "repl.swift")は、正常に実行されるすべてのREPL行を追跡しているようです。新しいREPLにそれを再生する方法はないようです - 私は次にそれを見つけようとします。 – joelparkerhenderson

+0

ファイルを処理してすべてのコメントを除外し、それをただちにswiftの呼び出しに残すことはどうでしょうか? – algal

+1

これはもうSwift 3.1では機能しません。 '__FILE__'は'#file'に名前が変更され、 'repl.swift'が出力されます。ただし、 'find/var/folders/-name repl.swift'を使ってマッチを調べることはできます。 – Palle

1

古典的なコマンドラインユーティリティexpectを試すことができます。

expectは、テキストベースの対話のスクリプトを再生し、期待される応答を監視します。もちろん、これにはexpectスクリプトを作成する必要があります。

しかし、(MacPortsのような)パッケージマネージャからexpectをインストールすると、autoexpectというコマンドがインストールされ、キーストロークを監視してexpectスクリプトを自動的に生成することができます。

たとえば、あなたが行うことができます:

autoexpect -f myscript swift 

は、REPLに対話し、終了したら終了します。その後、後で行うことができます

./myscript 

このセッションを再生します。

問題がありますか? autoexpectは、REPLを閉じる最後のコマンドを含むスクリプトを生成します。スクリプトを実行してそのコマンドを省略し、制御を渡す方法があるかどうかはわかりません。

これは、これらのユーティリティが元々設計されていたものと似ているようです。その機能が既に存在していないと私は驚くでしょう。

他の同様のコマンドは、scriptinteractです。

+1

これは、 'expect'コマンドと' script'コマンドが他の多くのゴールで非常に有用であることから、私にこれらを紹介してくれてありがとうございます。 – joelparkerhenderson

関連する問題