2017-05-01 3 views
0

나는 REPL에 도서관을 은 OCaml의 .cma를로드하지

  • 로드를 컴파일 몇 OCaml의 모듈
  • 사이에 퍼져 라이브러리에서 다음

    1. 일을 할 노력하고있어 공개 API 실험하기

    1과 2를 수행하기 위해 opam 파일과 함께 jbuilder을 사용하고 있습니다. 이제는이 모든 것이 내 라이브러리를 쉽게 컴파일하는 데 효과적이지만 repl에서 테스트하는 데 문제가 있습니다.

    현재 나의 접근 방식은 repl을 회전시키고 #load "_build/default/<name-of-main-library-module>.cma을 사용하는 것입니다. 이것은 이미 내 종속성을 #require에 가지고 있기 때문에 성공적으로 실행됩니다. 그러나 이것은 실제로 repl의 바인딩 집합에 영향을 미치지 않는 것처럼 보입니다. MainLibraryModule도 모듈로 바인딩되어 있지 않으며 공용 API가 모듈 이름으로 규정되지 않은 것으로 소개되지 않았습니다.

    여기서 분명히 잘못된 일을하고 있는데, 내 라이브러리로 놀 수 있도록이 cma 파일을 어떻게로드해야합니까? 작업 3을 수행하는 데 더 좋은 방법이 있다면 (어떤 방식 으로든 전역 상태를 수정하지 않고)이 작업도 가능합니다.

  • 답변

    1

    .cma 파일에 정의 된 모듈을 사용하려면 REPL은 해당 .cmi 파일을 찾을 수 있어야합니다.이 파일은 라이브러리의 모듈 용으로 컴파일 된 인터페이스 파일입니다.

    <path_to_cmis> 디렉토리에 cmi 파일이 포함될 가능성이있는 디렉터리를 추가하는 #directory <path_to_cmis>;; 지시문의 사용 사례입니다. 귀하의 경우에는

    , 당신은 #load 지시하기 전에이 지시 #directory을 추가해야합니다

    #directory "build/path_to_cmis";; 
    #load "build/path_to_cma";; 
    
    0

    #load을 사용하면로드 된 모듈의 최상위 이름이 REPL의 최상위 이름으로 추가되지 않습니다. 이 효과를 얻으려면 open 모듈이 필요합니다.

    # #load "unix.cma";; 
    # stat;; 
    Error: Unbound value stat 
    # Unix.stat;; 
    - : string -> Unix.stats = <fun> 
    # open Unix;; 
    # stat;; 
    - : string -> Unix.stats = <fun> 
    

    모듈 이름의 바인딩을 어떻게 확인합니까?