Сохранение моего бегущего вполне
-
09-10-2019 - |
Вопрос
При работе в ocaml
или ghci
Toplevels Я часто создаю значительный «контекст» для желания лучшего слова, связанных ценностей, функций, модулей загруженных и т. Д. Есть ли способ сохранить все это и перезагрузить его позже, чтобы я мог продолжать точно, где я остановился? Или еще лучше выбросить весь лот в качестве текстового файла, который можно перезагрузить или быть тривиально изменен в код, который я мог бы компилировать в исполняемости (например, добавив основной)?
Решение
Пользователи Hol Light. были подобные потребности, и они используют программу контрольной точки для сохранения снижения Toplosevel. Видеть это сообщение в списке CAML-рассылки или страница 8 Это руководство от Hol.
В целом лучше сохранить определения в качестве исходного кода, а не двоичного снимка Toplevel. Многочисленные инструменты позволяют быстро загрузить файл .ml в Toplevel для простых экспериментов (режимы Emacs и т. Д.). См. Предупреждение в руководстве HOL:
При разработке больших доказательств в HOL вы всегда должны хранить защитный скрипт в виде файла OCAML, готов к перезагрузке, а не полагаться на CKPT. Это позволит доказательствам позже модифицировать, используемые другими и т. Д. Однако его можно очень удобно сделать промежуточные снимки, поэтому вам не нужно загружать большие файлы, чтобы работать дальше на доказательстве. Это аналогично обычной ситуации в программировании: вы всегда должны держать свой полный исходный код, но не хотите перекомпилировать все источники каждый раз, когда вы используете код.
Другие советы
По крайней мере, в Ocaml нет встроенной поддержки для этого. На растворе следует использовать rlwarap. или любая другая обертка для чтения для записи истории вашего ввода в файл. Например :
> rlwrap -H mysession.ml ocaml
Недостаток состоит в том, что это также запишит вход, который имел синтаксические ошибки, поэтому вам придется очистить это. Обратите внимание, что по умолчанию RLWRAP автоматически сохранит ваш вход в ~ / .OCAML_HISTORY, если вы вызываете его без опции -H.
В Haskell, просто используйте :e file
. Отказ Это открывает стандартный редактор и позволяет редактировать некоторый файл. После этого используйте :r
перезагрузить его. Он будет автоматически перекомпилирован.
Пожалуйста, обратите внимание, что все ваши «Ad-Hoc» определенные функции будут потеряны после этого. Обратитесь к DOC для получения дополнительной информации.
ghci
использует Haskeline. Для истории ввода командной линии, чтобы вы могли прокрутить доходы до повторения / редактирования входов. Ваша история ввода обычно записывается в файл, который вы можете найти как ghci_history
в каталоге, данном
System.Directory.getAppUserDataDirectory "ghc"
Существуют различные команды для изучения «контекста» (: «Показать привязки»: «Показать модули»: DEF, ..) Но их вывод не хватает, чтобы воспроизвести вашу сессию (хотя оно все равно стоит узнать о них).
В общем, совет комбинировать ваш ghci
Сеанс с окном открытого редактора является звуком: если это больше, чем определение сброса, даже если только для целей отладки, лучше включить его в модуль, который будет загружен в ghci
, Так что вы можете повторно использовать это.
Ох, и если «контекст», вы имеете в виду некоторые настройки по умолчанию или модули, которые вы хотите загрузить, на основе PER-проекта, есть также ghci
С. Файл конфигурации. Отказ Также удобно для определения собственного ghci
команды.
В Ocaml вы можете создать свой собственный верхний уровень. Это решает проблему с загруженными модулями по меньшей мере.
http://caml.inria.fr/pub/docs/manual-oCaml/toplevel.html#sec278.
Команда OCAMLMKTOP создает ocaml Toplevels, которые содержат код пользователя, предварительно загруженный при запуске.
Команда OCAMLMKTOP принимает аргумент набор файлов .CMO и .CMA и связывает их с объектами файлов, которые реализуют ocaml Toplosevel. Типичное использование:
ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo
Это создает файл BYTECODE MYTOWLEVEL, содержащий систему Toplevel Ocaml, а также код из трех файлов .CMO. Этот Toplevel напрямую исполняется и начинается:
./mytoplevel
Это входит в регулярное петли для верхнего уровня, за исключением того, что код из Foo.cmo, bar.cmo и gee.cmo уже загружен в память, как если бы вы набрали:
#load "foo.cmo";; #load "bar.cmo";; #load "gee.cmo";;
на входе в топлю. Модули Foo, Bar и Gee не открываются, хотя; Вы все еще должны сделать
open Foo;;
Сам, если это то, что вы хотите.
Это всегда беспокоило меня тоже, поэтому я написал быстрый питон / ожидаю скрипт Чтобы воспроизвести GHCI_HISTORY в начале каждой сессии GHCI.
Это не очень отполировано. Например, это всегда повторяет всю историю, и это может быть медленной.