2011-08-31 4 views
13

OCaml repl ("최상위 레벨")은 사용자 정의 또는 다른 유형의 모든 유형에 대해 풍부한 인쇄 기능을 제공합니다. 자신 만의 전체 유형 세트에 대해 가치있는 프린터 세트를 작성하는 대신 최상위 레벨 외부에서이 기능에 액세스 할 수 있습니까?OCaml 값은 어떻게 최상위 외부에서 인쇄 될 수 있습니까?

답변

11

예쁜 인쇄 시설은 최상위 라이브러리의 일부입니다. 출처는 toplevel/genprintval.ml입니다. 유형 정보가 필요하다는 점을 고려하면 이해할 만합니다. 단지 값을 던질 수는 없으며 예쁘고 프린터를 선택하는 것은 유형에 기반합니다.

당신이 당신의 프로그램에서이 코드를 사용하려면, 그것은 수, 당신은 최상위 라이브러리 (toplevellib.cma)와 연결해야하거나 유형을 분석하는 유형 검사의 충분한 비트에 데려 의미한다 (genprintval 컴파일 꽤 크게된다).

디버거 (debugger/printval.mldebugger/loadprinter.ml)와 비슷한 기능이 있지만 (코드를 공유하지는 않습니다.) 디버거에 있습니다.

직접 연결할 수 있고 예쁜 인쇄 기능을 제공하는 타사 라이브러리가 있습니다. ExtlibStd.dump은 매우 조잡한 시설을 제공합니다 (유형에 기반하지 않음). Jeremy Yallop 및 Jake Donham의 Deriving이 또 다른 접근 방법입니다. This Caml Weekly News item은 더 많은 제안을 제공합니다.

+0

유형을 분석하기 위해 소스 코드가 필요하지 않습니까? – newacct

+1

@newacct 네, 타입 정보가 필요합니다.이 정보는 컴파일러에 의해 버려집니다 (그러나 최상위 레벨이나 디버거에서 사용 가능합니다). 타사 라이브러리는 제네릭 형식 종속 예쁜 프린터를 작성하는 방식이 아니라 모든 유형에 대해 유형별 예쁜 프린터를 작성하는 간단한 방법을 제공합니다. 제네릭을 허용하는 언어 확장은 있지만 프로덕션 준비 구현 AFAIK는 없습니다. – Gilles

+1

btw 현재, 최소한, @newacct에 언급 된 "Extlib.Std.dump"와 "BatPervasives.dump"는 같은 함수입니다 :'Extlib.Std.dump == BatPervasives.dump ;;'=>'bool = true'. – Mars

10

OCaml 배터리 포함 라이브러리에는 BatPervasives 모듈에 dump 기능이 포함되어 있습니다. 모든 값을 문자열로 변환하고이를 반환합니다. 소스 코드는 here입니다. 일부 정보는 런타임에 손실되기 때문에 출력은 최상위와 동일하지 않습니다. 추상 데이터 형식 생성자는 정수가됩니다.

+0

@MikeSamuel : fixed – newacct

관련 문제