2017-11-29 4 views
0

このモジュールのシグネチャでマスクされたこのモジュールの変数に依存するモジュールのいくつかの機能の奇妙な動作を理解しようとします。この変数はプログラムのいくつかの点で印刷したいと思いますが、マスクされているためアクセス方法はわかりません。デバッグ目的でモジュールのシグネチャをバイパスすることはできますか?

さらに、このモジュールは私が修正して再コンパイルしたくない大きなプロジェクトの一部です。

デバッグの目的でこの変数にアクセスできますか?一時的に汚いものをしても?

編集:ここにいくつかの代表的なコード

module type S = sig val f : unit -> unit end 
module M : S = struct let x = ref 0 let f() = Format.printf "%[email protected]" !x; incr x end 

M.xにアクセスする方法は?

+0

'ocamldebug'で意味しますか? –

+0

'ocamldebug'またはコーディングを使用しています。私は両方に興味があります。 – eponier

+0

あなたの質問にいくつか[MCVE]、またはその中にいくつかのコードをつけてみてください。 –

答えて

0

もちろん可能です!

まず、あなただけのしばらくの間、署名を非表示にすることができます:

module type S = sig val f : unit -> unit end 
module M (* : S *) = struct 
    let x = ref 0 
    let f() = Format.printf "%[email protected]" !x; incr x 
end 

かを、あなたは署名にxを表示することができます。

module type S = sig 
    val x : int ref 
    val f : unit -> unit 
end 
module M : S = struct 
    let x = ref 0 
    let f() = Format.printf "%[email protected]" !x; incr x 
end 

お好みのよう。いずれの場合も、M.xがモジュール外で利用可能になります。

あなたも、このように機能print_xを定義することができます。

module type S = sig 
    val print_x : unit -> unit 
    val f : unit -> unit 
end 
module M : S = struct 
    let x = ref 0 
    let print_x() = Format.printf "%[email protected]" !x 
    let f() = Format.printf "%[email protected]" !x; incr x 
end 

、あなたが好きな場所M.print_x()を使用しています。

+0

ありがとうございますが、すべてのソリューションでモジュールのコードが変更されています。 – eponier

+0

それから私は不可能だと恐れています。もしシグネチャが '.mli'の中にあれば、このファイルがなくても再コンパイルを試みることができますが、シグネチャやモジュールを変更したくなければ、(私の知る限り)それを行うことはできません。 。 – Lhooq

関連する問題