Сохранение моего бегового уровня на потом - PullRequest
29 голосов
/ 19 октября 2010

При работе на верхних уровнях ocaml или ghci я часто создаю значительный "контекст" из-за отсутствия лучшего слова, связанных значений, функций, загруженных модулей и так далее. Есть ли способ сохранить все это и перезагрузить его позже, чтобы я мог продолжить именно там, где остановился? Или, что еще лучше, выгрузить весь лот в виде текстового файла, который может быть перезагружен или тривиально преобразован в код, который я могу скомпилировать в исполняемый файл (например, добавив Main)?

Ответы [ 6 ]

11 голосов
/ 19 октября 2010

Пользователи HOL light имели аналогичные потребности, и они используют программу контрольных точек для сохранения снимка верхнего уровня.См. это сообщение в списке рассылки caml или стр. 8 из этого учебного пособия по HOL .

В целом, лучше сохранить определения как исходный код, ачем двоичный снимок верхнего уровня.Многочисленные инструменты позволяют быстро загрузить файл .ml в верхний уровень для удобства экспериментов (режимы emacs и т. Д.).См. Предупреждение в руководстве по HOL:

При разработке больших доказательств в HOL вы всегда должны сохранять сценарий проверки в виде файла OCaml, готового к перезагрузке, а не полагаться на ckpt.Это позволит впоследствии изменять доказательства, использовать их для других и т. Д. Однако может быть очень удобно делать промежуточные снимки, чтобы вам не приходилось загружать большие файлы для дальнейшей работы с доказательством.Это аналогично обычной ситуации в программировании: вы всегда должны сохранять свой полный исходный код, но не хотите перекомпилировать все исходные коды каждый раз, когда используете код.

10 голосов
/ 19 октября 2010

В Haskell просто используйте :e file.Это открывает стандартный редактор и позволяет редактировать некоторые файлы.После этого используйте :r, чтобы перезагрузить его.Он будет автоматически перекомпилирован.

Обратите внимание, что все ваши «специальные» функции будут потеряны после этого.Обратитесь к документации для получения дополнительной информации.

10 голосов
/ 19 октября 2010

По крайней мере, в OCaml нет встроенной поддержки для этого. Решение - использовать rlwrap или любую другую оболочку readline для записи истории вашего ввода в файл. Например:

> rlwrap -H mysession.ml ocaml

Недостатком является то, что при этом также будут записываться входные данные с синтаксическими ошибками, поэтому вам придется их убрать. Обратите внимание, что по умолчанию rlwrap автоматически сохранит ваш ввод в ~ / .ocaml_history, если вы вызовете его без опции -H.

7 голосов
/ 19 октября 2010

В ocaml вы можете создать свой собственный верхний уровень. Это решает проблему как минимум с загруженными модулями.

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

Команда ocamlmktop создает уровни OCaml, содержащие код пользователя предварительно загружен при запуске.

Команда ocamlmktop принимает в качестве аргумента набор файлов .cmo и .cma, и связывает их с объектными файлами, которые реализуют OCaml верхний уровень. Типичное использование:

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

Это создает файл байт-кода mytoplevel, содержащий OCaml Система верхнего уровня плюс код из трех файлов .cmo. это toplevel исполняется напрямую и запускается:

    ./mytoplevel

Это входит в обычный цикл верхнего уровня, за исключением того, что код из foo.cmo, bar.cmo и gee.cmo уже загружены в память, как если бы Вы ввели:

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

при въезде на высший уровень. Модули Foo, Bar и Gee не являются открыл, хотя; вам еще нужно сделать

    open Foo;;

сами, если это то, что вы хотите.

7 голосов
/ 19 октября 2010

ghci использует haskeline для истории ввода командной строки, поэтому вы можете прокручивать вверх, чтобы повторять / редактировать вводы. Ваша история ввода обычно записывается в файл, который вы можете найти как ghci_history в каталоге, указанном

System.Directory.getAppUserDataDirectory "ghc"

Существуют различные команды для изучения «контекста» (: show bindings,: show modules,: def, ..), но их вывода будет недостаточно для воспроизведения вашего сеанса (хотя в любом случае о них стоит знать).

В общем, совет объединить вашу ghci сессию с открытым окном редактора звучит разумно: если это больше, чем одноразовое определение, даже если это просто для целей отладки, лучше включить его в модуль, который будет загружен в ghci, чтобы вы могли использовать его снова.

Да, и если под «контекстом» вы подразумеваете некоторые настройки по умолчанию или модули, которые вы хотите загрузить, для каждого проекта, есть также ghci файл конфигурации . Также удобно для определения ваших собственных команд ghci.

5 голосов
/ 21 октября 2010

Меня это тоже всегда беспокоило, поэтому я написал быстрый python / сценарий для воспроизведения ghci_history в начале каждой сессии ghci.

Это не очень отполировано. Например, он всегда воспроизводит всю историю, и это может быть медленным.

...