2017-11-29 7 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