2017-05-08 9 views
3

私が理解しているように、OCamlの設計と根底にある考え方のために、例えばこのような任意のデータ構造を印刷するために使用できる汎用の印刷機能はありません。組み込みのpretty printerをデバッグに使用しますか?

[([2; 1; 0], 1.); ([2; 1], 0.471206873564138595); ([2; 0], 0.467882609464025379)] 

デバッグ用です。すべてのデータ構造を扱う関数はOCamlに入力型を持たないでしょうが、意味がありません。

標準データ構造(リスト、タプル、数字など)(図に示すようにherehere)から作成できるデータ構造を印刷するための少しの関数を書くことができます。異なるデータ構造などが含まれます。デバッグ出力を得たいだけなら、それは大変な作業です。

はしかし、utopとocamlのはあらゆるタイプの評価結果を表示するために、かなり印刷ルーチンに組み込まれて使用しており、この機能へのアクセスを取得する方法はありますなどのリスト、タプルの内容を表示します - エイREPLの一部であるPにアクセスするには?実際、私は上記のリストを表示するために使用した文字列を作成するためにutopの端末出力からマウスコピーを作成しました。私のコードからそれを行うことはできませんか?

これを行うことができれば、それは実際には一般的にやるべきことではなく、デバッグやその他の単純な目的にのみ使用するべきだということを認めます。汎用印刷機能を広く使用することは、最初にOCamlを使用する理由の1つである型システムを邪魔することになります。

(私は答えは「いいえ、あなたはそれを行うことができない」である、または私はそれを行う方法に遭遇しただろうと確信している。なぜ、しかし?十分シンプルなようです。)

答えて

2

印刷toplevelとutopの関数は型情報にアクセスできます。通常のOCaml実行可能ファイル(バイトコードまたはネイティブ)には、(話す)型情報はありません。だからあなたは、トップレベルまたはユートップからプリント機能を差し込むだけではいけません。

これはよくある質問です(実際にデバッグするのに便利です)。この以前のSOの答えにもう少し情報があります:How can OCaml values be printed outside the toplevel?

+0

ありがとうございました。それは今意味がある。私は似たような質問をしましたが、見つけられませんでしたが、他の人が同じことを思っていたことは分かっていました。私の質問は、あなたがリンクした質問の重複としてマークする必要がありますので、私は自分の質問を閉じるために投票しました。それが意味をなさないかどうかわかりません。 – Mars

関連する問題