2017-09-06 59 views
0

我運行Ubuntu,安裝ocaml的,並寫了下面的腳本,因爲我發現它在一組指令(課程筆記):如何在Ocaml中打開一個模塊?

;; open Assert 
;; print_int 1 

將該文件保存爲test.ml。然後,在一個端I導航到包含該文件的文件夾,並執行

$ ocaml test.ml 

含文件夾具有assert.ml文件和assert.mli。我在這些課程筆記和Ocaml的網站上查看了一些文檔,除了嘗試上述內容之外,找不到有關如何打開模塊的任何官方聲明。當我運行這個,我得到錯誤信息

File "test.ml", line 1, characters 8-14: 
Error: Unbound module Assert 

任何人都可以描述這是如何工作?

+0

需要注意的是,你應該寫 '開放斷言 設()= print_int 1' ,避免'';;乾脆。 – ChriS

回答

2

如果你只是assert.ml和assert.mli,那麼你需要先編譯它們,然後才能在其他代碼中使用它們。

您可以直接使用ocaml的編譯器是這樣的:

$ ocamlc -c assert.mli 
$ ocamlc -c assert.ml 

這將創建文件命名assert.cmi(assert.ml的編譯版本)和assert.cmo(assert.ml的編譯版本)。

之後,如果你運行它,這樣你test.ml文件應該工作確定:(感謝@camlspotter)

$ ocaml assert.cmo test.ml 

open結構OCaml中不會導致模塊如果以前沒有可用的話就可以使用。它的作用是使模塊直接可用。如果沒有open,則需要在名稱前加上模塊的名稱:Module.name。在我看來(由其他人共享),最好限制使用open,以避免在代碼範圍中引入太多名稱。

作爲一個方面的評論,它是從;;開始你的行風格非常奇怪。該令牌用於告訴OCaml頂層(解釋器)它應該評估迄今爲止輸入的內容。所以它通常會在後面一些有趣的表達。

我個人完全不在源文件中使用;;。我只在將表達式輸入到頂層時才使用它。

+0

''assert.ml'的目標代碼不是'ocaml'自動加載的,因此編譯是不夠的。 'ocaml assert.cmo test.ml'是必需的。 – camlspotter

+0

(當我嘗試它時,它對我有用,但也許我沒有嘗試使用任何實際的代碼,謝謝。) –