2016-12-05 10 views
0

テストファイルでモジュールを使用する際に問題が発生しています。私はこの問題を再現した簡単なバージョンを作成しました。メイクファイル(Ocaml)でモジュールを使用する際に問題が発生する

(* person.ml *) 
module Person = struct 
    type person = {name: string; age: int} 

    let create_person name age = {name=name; age=age} 

end 

(*makefile *) 
test: 
    ocamlbuild -pkgs oUnit,yojson,str,ANSITerminal test.byte && ./test.byte 

check: 
    bash checkenv.sh 

clean: 
    ocamlbuild -clean 

(* test.ml *) 
open OUnit2 
open Person 

let person = create_person "john" 40 

(* utop *) 
#use "person.ml" 
open Person 
let person = create_person "john" 40 

Output: val person : person = {name = "john"; age = 40} 

(* when I type in "make" in the terminal *) 

ocamlbuild -pkg oUnit test.byte && ./test.byte 
+ /Users/user/.opam/4.03.0/bin/ocamlc.opt -c -I /Users/user/.opam/4.03.0/lib/oUnit -I /Users/user/.opam/4.03.0/lib/ocaml -o test.cmo test.ml 
File "test.ml", line 4, characters 13-26: 
Error: Unbound value create_person 
Command exited with code 2. 
Hint: Recursive traversal of subdirectories was not enabled for this build, 
    as the working directory does not look like an ocamlbuild project (no 
    '_tags' or 'myocamlbuild.ml' file). If you have modules in subdirectories, 
    you should add the option "-r" or create an empty '_tags' file. 

    To enable recursive traversal for some subdirectories only, you can use the 
    following '_tags' file: 

     true: -traverse 
     <dir1> or <dir2>: traverse 

Compilation unsuccessful after building 4 targets (2 cached) in 00:00:00. 
make: *** [test] Error 10 

答えて

2

問題は事実person_createから来てアクセス可能であるVI Person.create_personはperson_createだけではありません。 ocamlでは、ファイルはすでにモジュールです。 Personを開くと、ファイル名がperson.mlのモジュールが開きます。そのモジュールでは、Personという名前のモジュールを作成します。このモジュールでは、person_createを定義します。したがって、ファイル内のPersonモジュールを削除するか、create_personの代わりに "Person.create_person"と入力します。
utopでテストした場合:#use疑似命令はインクルードのようです。したがって、ファイル名を失うと、person_createはPersonを開くとすぐにアクセスできます。

関連する問題