ocaml
またはトップレベルで作業するとき、ghci
私はより良い言葉、バインドされた値、関数、ロードされたモジュールなどを求めて、重要な「コンテキスト」を構築することがよくあります。そのすべてを保存して後でリロードして、中断したところから正確に続行できるようにする方法はありますか? それとも、再ロードできるテキスト ファイルとしてロット全体をダンプするか、(たとえば Main を追加して) 実行可能ファイルにコンパイルできるコードに簡単に変更できますか?
6 に答える
HOL ライトのユーザーにも同様のニーズがあり、チェックポイント プログラムを使用してトップレベルのスナップショットを保存しています。camlメーリング リストのこのメッセージ、またはこの HOL チュートリアルの 8 ページを参照してください。
一般に、バイナリのトップレベル スナップショットではなく、ソース コードとして定義を保持することをお勧めします。多数のツールを使用すると、.ml ファイルをトップレベルにすばやくロードして簡単に実験できます (emacs モードなど)。HOL チュートリアルの警告を参照してください。
HOL で大規模な証明を開発する場合、ckpt に依存するのではなく、常に証明スクリプトを OCaml ファイルとしてリロードできる状態にしておく必要があります。これにより、プルーフを後で変更したり、他の人が使用したりできます。ただし、プルーフでさらに作業するために大きなファイルをロードする必要がないように、中間スナップショットを作成すると非常に便利です。これは、プログラミングの通常の状況に似ています。常に完全なソース コードを保持する必要がありますが、コードを使用するたびにすべてのソースを再コンパイルする必要はありません。
Haskell では、単に使用します:e file
。これにより、標準エディターが開き、一部のファイルを編集できます。その後、 を使用:r
してリロードします。自動的に再コンパイルされます。
この後、「アドホック」に定義された関数はすべて失われることに注意してください。詳細については、ドキュメントを参照してください。
少なくとも OCaml では、組み込みのサポートはありません。解決策は、rlwrapまたはその他の readline ラッパーを使用して、入力の履歴をファイルに記録することです。例えば :
> rlwrap -H mysession.ml ocaml
欠点は、これにより構文エラーのある入力も記録されるため、それを消去する必要があることです。-H オプションなしで呼び出した場合、デフォルトで rlwrap は自動的に入力を ~/.ocaml_history に保存することに注意してください。
ghci
コマンドライン入力履歴にhaskelineを使用するため、上にスクロールして入力を繰り返し/編集できます。入力履歴は通常、ファイルに記録されます。このファイルは、次のようghci_history
に指定されたディレクトリにあります。
System.Directory.getAppUserDataDirectory "ghc"
「コンテキスト」を探索するためのさまざまなコマンド (:show bindings、:show modules、:def、..) がありますが、それらの出力はセッションを再現するのに十分ではありません (とにかくそれらについて知っておく価値はあります)。
一般に、セッションを開いているエディタ ウィンドウと組み合わせるというアドバイスghci
は適切です。それが単なるデバッグ目的であっても、使い捨ての定義以上のものである場合は、それを にロードするモジュールに含めて、ghci
再利用できるようにすることをお勧めします。 .
ああ、「コンテキスト」とは、プロジェクトごとにロードしたいデフォルト設定またはモジュールを意味する場合、ghci
の構成ファイルもあります。ghci
独自のコマンドを定義する場合にも便利です。
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
これにより、OCaml トップレベル システムと 3 つの .cmo ファイルのコードを含むバイトコード ファイル mytoplevel が作成されます。このトップレベルは直接実行可能で、以下によって開始されます。
./mytoplevel
これは通常のトップレベル ループに入りますが、foo.cmo、bar.cmo、および gee.cmo からのコードは、次のように入力した場合と同様に既にメモリに読み込まれています。
#load "foo.cmo";; #load "bar.cmo";; #load "gee.cmo";;
トップレベルへの入り口。ただし、モジュール Foo、Bar、および Gee は開かれていません。あなたはまだしなければならない
open Foo;;
これがあなたが望むものなら、あなた自身。
これは私もいつも気になっていたので、各 ghci セッションの開始時に ghci_history を再生する簡単な python/expectスクリプトを書きました。
あまり磨かれていません。たとえば、常に履歴全体を再生するため、遅くなる可能性があります。