2017-05-01 39 views
0

我試圖做攤開當中一些ocaml的模塊 ocaml的不加載.cma預期

  • 庫下面

    1. 工作
    2. 加載編譯庫到REPL以試驗公共API

    爲了做1和2,我使用了jbuilder以及一個opam文件。現在所有這些都很適合編譯我的庫,但是我無法在repl中測試它。

    我目前的做法是旋轉一個repl並使用#load "_build/default/<name-of-main-library-module>.cma。這成功執行,因爲我已經有#require編輯我的依賴關係。但是,這實際上並不影響repl中的一組綁定。 MainLibraryModule都不作爲模塊綁定,也不是由模塊名稱引入的非公共API。

    我在做什麼明顯錯誤在這裏,我應該如何加載這個cma文件,所以我可以玩我的圖書館。如果有更好的方法來完成任務3(不以任何方式修改全局狀態),我也會接受這一點。

  • 回答

    1

    爲了使用.cma文件中定義的模塊,REPL需要能夠找到相應的.cmi文件,它們是庫中模塊的已編譯接口文件。

    這是#directory <path_to_cmis>;;指令的用例,它將目錄<path_to_cmis>添加到潛在包含cmi文件的目錄列表中。

    在你的情況,你需要的 #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> 
    

    如何檢查模塊名稱的綁定?