2010-10-19 9 views
27

Podczas pracy nad zbiorami często tworzę znaczący "kontekst" z powodu braku lepszego słowa, związanych wartości, funkcji, modułów załadowanych i tak dalej. Czy istnieje sposób na zapisanie tego wszystkiego i ponowne załadowanie go później, abym mógł kontynuować dokładnie to, co zostało przerwane? Albo jeszcze lepiej, zrzucić całą partię jako plik tekstowy, który można przeładować lub zmodyfikować w prosty sposób do kodu, który mógłbym skompilować do pliku wykonywalnego (np. Dodając Main)?Zapisywanie mojej bieżącej wersji do późniejszego

+1

Czasy, o które marzyłem. Ponowne ustawianie "kontekstu" czasami doprowadzało mnie do szału. – Daniel

+1

Uwaga: moja nagroda jest za najlepszą odpowiedzią dotyczącą Haskella, czy to ghci, czy uścisków. –

+0

@A. Rex: Przepraszam za spóźnienie, właśnie zobaczyłem nagrodę dzisiaj. Dziękuję Ci bardzo!!! – fuz

Odpowiedz

11

Użytkownicy z HOL light mają podobne potrzeby i używają programu do punktowania, aby zapisać migawkę ekranu. Zobacz this message na liście mailingowej lub na stronie 8 pod adresem this HOL tutorial.

Ogólnie lepiej jest zachować definicje jako kod źródłowy, niż migawkę dwójkową. Liczne narzędzia pozwalają szybko wczytać plik .ml do poziomu ekranu, co ułatwia eksperymentowanie (tryby emacs itp.). Patrz ostrzeżenie w tutorialu HOL:

Przy opracowywaniu dużych dowodów w HOL, zawsze należy zachować dowód skrypt jako złożyć OCaml gotowy, aby przeładować, zamiast polegać na CKPT. Umożliwi to późniejszą modyfikację proofów, które będą później modyfikowane, używane przez inne osoby itp. Jednakże może być bardzo wygodne wykonanie pośrednich migawek , więc nie trzeba ładować dużych plików, aby pracować dalej nad dowodem. Jest to analogiczne do zwykłej sytuacji w programowaniu: należy zawsze przechowywać pełny kod źródłowy , ale nie należy rekompilować wszystkich źródeł za każdym razem, gdy używa się kodu .

10

Przynajmniej w OCaml nie ma wbudowanej obsługi tego. Rozwiązaniem jest użycie rlwrap lub dowolnej innej owijki readline do zapisania historii wejścia do pliku. Na przykład:

> rlwrap -H mysession.ml ocaml 

Wadą jest to, że będzie to również rejestrować dane wejściowe, które miały błędy składniowe więc musisz oczyścić że na zewnątrz. Zauważ, że domyślnie rlwrap automatycznie zapisze twoje dane wejściowe w ~/.ocaml_history, jeśli wywołasz je bez opcji -H.

+0

Mam już alias zdefiniowany w mojej powłoce, oc = 'rlwrap ocaml', więc to jest łatwe do zrobienia i doprowadzi mnie do miejsca, w którym byłem z #use ... Myślę, że to co chciałbym to odpowiednik komenda "env" powłoki, która zrzuca wszystkie zmienne środowiskowe. – Gaius

9

W Haskell wystarczy użyć :e file. Spowoduje to otwarcie standardowego edytora i edycję niektórych plików. Następnie użyj :r, aby ponownie załadować. Zostanie automatycznie przekompilowany.

Należy zauważyć, że wszystkie zdefiniowane funkcje "ad-hoc" zostaną po tym utracone. Więcej informacji znajduje się w dokumencie.

+1

Alternatywą do tego jest praca w trybie haskell w Emacsie, edycja pliku i C-c C-l, aby wysłać go do gorszego procesu. Gdyby był dwukierunkowy, byłby idealny. – Gaius

+1

Uruchom ghci w Emacs, a następnie ': e' stamtąd? Nie całkiem serio ... –

7

ghci używa haskeline dla historii wprowadzania wiersza poleceń, dzięki czemu można przewijać w górę, aby powtarzać/edytować wejścia. Historia wejście jest zwykle zapisywane w pliku, który można znaleźć w ghci_history w katalogu określonym przez

System.Directory.getAppUserDataDirectory "ghc" 

Istnieją różne polecenia do odkrywania „kontekst” (show Wiązania: Lista modułów: def, ..) ale ich wyniki nie wystarczą do odtworzenia twojej sesji (choć i tak warto o nich wiedzieć).

Ogólnie rzecz biorąc, poradą, aby połączyć sesję ghci z otwartym oknem edytora jest dźwięk: jeśli jest to więcej niż definicja jednorazowa, nawet jeśli służy tylko do debugowania, lepiej umieść ją w module do załadowania do ghci, abyś mógł go ponownie użyć.

Aha, i jeśli przez "kontekst" rozumie się niektóre domyślne ustawienia lub moduły, które mają być ładowane, na podstawie projektu, istnieje również ghci 's configuration file. Przydaje się również do definiowania własnych poleceń ghci.

7

W ocaml można zbudować własny najwyższy poziom. Rozwiązuje problem przynajmniej z załadowanymi modułami.

http://caml.inria.fr/pub/docs/manual-ocaml/toplevel.html#sec278

Komenda ocamlmktop buduje toplevels SML które zawierają kod użytkownika preinstalowanym przy rozruchu.

Polecenie ocamlmktop przyjmuje jako argument zbiór plików .cmo i .cma, i łączy je z plikami obiektowymi, które implementują plik OCaml . Typowym zastosowaniem jest:

ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo 

Stwarza to mytoplevel pliku kodu bajtowego, zawierający system Toplevel OCaml , plus kod z trzech .cmo plików. Ten toplevel jest bezpośrednio wykonywalny i zostanie uruchomiony przez:

./mytoplevel 

ten wchodzi regularną pętlę Toplevel, chyba że kod z foo.cmo, bar.cmo i gee.cmo jest już załadowany do pamięci, tak jak jeśli wpisał:

#load "foo.cmo";; 
    #load "bar.cmo";; 
    #load "gee.cmo";; 

na wejściu do toplevel. Moduły Foo, Bar i Gee nie są jednak otwarte: ; nadal musisz zrobić to sam, jeśli to jest to, czego chcesz.

+0

Używam tej techniki, widziałem post na blogu na Jane Street o budowaniu "skryptów" z najtrafniejszymi rzeczami. Ale przypadek użycia, o którym myślę, jest na wzór pracy eksploracyjnej/eksperymentalnej, którą chcę zachować, aby ochronić się przed ponownym uruchomieniem komputera lub przenieść na inną maszynę i odebrać miejsce, w którym ją przerwałem. – Gaius

+0

Link zmarł. Podaj odpowiednią treść następnym razem. –

4

To zawsze przeszkadza mi też, więc napisałem krótki python/oczekiwać script odtworzyć ghci_history na początku każdej sesji ghci.

Nie jest zbyt dopracowany. Na przykład zawsze odtwarza całą historię i może być wolna.

+0

Zawsze istnieje ryzyko, że w trakcie sesji wykonałeś:! że nie chcesz powtarzać ... – Gaius

+1

Prawdopodobnie: ___ polecenia powinny być filtrowane. I oczywiście nie można strzec się wszystkiego. –

Powiązane problemy