Подтвердить что ты не робот

Сохранение текущего пробега для последующего использования

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

> rlwrap -H mysession.ml ocaml

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

Ответ 3

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

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

Ответ 4

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

System.Directory.getAppUserDataDirectory "ghc"

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

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

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

Ответ 5

В 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 toplevel system, плюс код из трех файлов .cmo. Эта toplevel является прямым исполняемым и запускается:

    ./mytoplevel

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

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

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

    open Foo;;

если это то, что вы пожелаете.

Ответ 6

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

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