2015-01-10 7 views
5

W SWPL REPL, jaki jest sposób na zachowanie stanu REPL?Swift REPL: jak zapisać/załadować stan REPL? (a.k.a. zawieszenie/wznowienie, migawka, klon)

  • Na przykład, chcę zrobić kilka prac w REPL, a następnie zapisać go, więc mogę go załadować później.

  • Koncepcja ta może być nazwany zapisu/odczytu, zawiesić/wznowić, snapshot/klon, serializowania/deserializowania itd

Każde rozwiązanie, które dostaje mnie do tego pomoże, nawet jeśli jest to hack w następujący sposób:

  • Nagraj wszystkie wiersze historii, a następnie powtórz je w innym REPL.

  • Serializuj wszystkie obiekty, a następnie deserializuj je w innym REPL.

  • Wykonaj migawkę RAM lub VM, a następnie sklonuj ją do innej maszyny.

  • Zapisz główny obraz stanu globalnego, a następnie wykonaj go później.

Moim celem jest zapisanie pracy REPL na jednej maszynie, a następnie załadowanie jej na inną maszynę.

Potrzebuję tylko stanu końcowego; Nie potrzebuję stosów, historii ani uchwytów itp.

Plac zabaw XCode ma podobną funkcję, używając opcji "Zapisz", która udostępnia treść.

+0

Wątpię, czy Swift ma jakiekolwiek poparcie dla tego (i takie ogólnie * wymaga * potrzeby wsparcia). Jeśli REPL został uruchomiony w VM z obsługą snu, ale niestety takie "obrazy" sprawiają, że SmallTalk jest jedyny w swoim rodzaju. Nie jestem również świadomy narzędzi migawek opartych na procesach, ale nie patrzyłem. – user2864740

+0

dlaczego nie korzystać z placu zabaw? – huocp

+0

@huocp Ponieważ SWIF REPL jest świetny - z mojego doświadczenia wynika, że ​​jest szybszy i lżejszy niż plac zabaw. – joelparkerhenderson

Odpowiedz

3

Może to może ci trochę pomóc.

Właśnie się dowiedziałem, że Swift REPL zapisuje bieżącą sesję w pliku.

Wpisz __FILE__ w REPL, zobaczysz plik sesji.

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

Możesz przeglądać zawartość pliku, śledzenie bieżącej sesji REPL. Jestem pewna, że ​​możesz zbudować jednoliniowy kod Swift, aby skopiować ten plik do folderu zapisywania, który musisz uruchomić na końcu sesji.

Przy okazji, w tym folderze temp, repl.swift jest w rzeczywistości bardziej zwarty niż repl1.swift. Prawdopodobnie chcesz skopiować repl.swift.

+0

Dzięki! Wydaje się, że Swift REPL tworzy wiele plików w katalogu __FILE__. Każde polecenie REPL wydaje się tworzyć dwa pliki: plik .swift i plik .cpp. Plik .swift bez numeru ("repl.swift") wydaje się śledzić wszystkie wiersze REPL, które pomyślnie działają. Nie wydaje się, aby można go było powtórzyć w nowym REPL - postaram się to znaleźć w następnej kolejności. – joelparkerhenderson

+0

Co powiesz na przetwarzanie pliku, aby odfiltrować wszystkie komentarze, a następnie po prostu wypakowanie tego, co zostało w inwokacji szybkiej? – algal

+1

To już nie działa w Swift 3.1. Nazwa "__FILE__" została zmieniona na '# file', a po prostu wyświetli' repl.swift'. Możesz jednak użyć 'find/var/folders/-name repl.swift' i przejrzeć dopasowania. – Palle

1

Możesz spróbować użyć klasycznego narzędzia wiersza poleceń expect.

expect powtarza skrypt interakcji tekstowych, obserwując oczekiwane odpowiedzi. Oczywiście wymaga to napisania skryptu oczekiwania.

Jednakże, jeśli instalujesz, oczekuj od menedżera pakietów (takiego jak MacPorts), to zainstaluje również komendę autoexpect, która może automatycznie śledzić twoje klawisze i generować skrypt expect.

Na przykład, można zrobić:

autoexpect -f myscript swift 

następnie oddziałują na repl i wyjść, kiedy skończysz. Później możesz wykonać tę operację, aby odtworzyć tę sesję.

Problem? autoexpect wygeneruje skrypt zawierający ostateczne polecenie zamknięcia REPL. Nie jestem pewien, czy istnieje sposób na uruchomienie skryptu, który pomija to polecenie i przekazuje ci kontrolę.

Wydaje się, że to dokładnie takie rzeczy, dla których te narzędzia były pierwotnie zaprojektowane, więc byłbym zaskoczony, gdyby ta funkcjonalność jeszcze tam nie istniała.

Inne podobne polecenia to script i interact.

+1

To jest wspaniała odpowiedź ogólna, ponieważ polecenia 'expect' i' script' są tak przydatne w wielu innych celach - dziękuję za wprowadzenie mnie! – joelparkerhenderson