Tôi mới dùng Ocaml và cố gắng viết một số ứng dụng mẫu nhỏ. Tôi đang sử dụng ocamlc
phiên bản 3.11.2 trong Linux Ubuntu 10.04. Tôi muốn biên dịch hai tệp:Biên soạn nhiều tệp Ocaml
a.ml
b.ml
Tệp b.ml
sử dụng định nghĩa từ a.ml
. Theo tôi hiểu, tôi có thể sử dụng ocamlc -c
để chỉ thực hiện biên dịch. Tôi có thể gọi ocamlc
lần cuối cùng khi tôi có tất cả các tệp .cmo
để liên kết chúng với tệp thực thi. Ngoài ra, khi biên dịch một tệp sử dụng các định nghĩa từ một tệp khác, tôi phải thông báo cho trình biên dịch trong đó tệp .cmi
để tìm các định nghĩa bên ngoài.
Vì vậy, ý tưởng của tôi là sử dụng:
ocamlc -i -c a.ml > a.mli
ocamlc -c a.mli b.ml
ocamlc -o b a.cmo b.cmo
Các công trình bước đầu tiên và tạo ra file a.mli
và a.cmo
, nhưng khi chạy bước thứ hai tôi nhận được
File "b.ml", line 1, characters 28-31:
Error: Unbound value foo
nơi foo
là một hàm được định nghĩa trong a.ml
và được gọi trong số b.ml
.
Vì vậy, câu hỏi của tôi là: làm cách nào tôi có thể biên dịch từng tệp nguồn một cách riêng biệt và chỉ định giao diện được nhập trên dòng lệnh? Tôi đã được tìm kiếm trong các tài liệu và theo như tôi có thể hiểu tôi phải xác định các tập tin .mli
được bao gồm, nhưng tôi không biết làm thế nào.
EDIT
Dưới đây một số chi tiết. Tập tin a.ml
chứa các định nghĩa
let foo = 5;;
tập tin b.ml
chứa các biểu
print_string (string_of_int foo)^"\n";;
Các ví dụ thực tế là lớn hơn nhưng với những tập tin này tôi đã có lỗi Tôi đã báo cáo ở trên.
EDIT 2
Tôi đã chỉnh sửa tập tin b.ml
và thay thế foo
với A.foo
và các công trình này (foo có thể nhìn thấy trong b.ml
mặc dù tôi có một lỗi biên dịch mà không phải là quan trọng đối với câu hỏi này). Tôi đoán rằng việc viết các tệp .mli
của riêng tôi rõ ràng hơn, như được đề xuất bởi
bạn có mở A bằng B ?, vì điều này không có ý nghĩa. –
No. Tôi có phải định nghĩa một mô-đun trong A và mở nó trong B không? Tại thời điểm này tất cả các định nghĩa trong A là toàn cục (tôi không có mô-đun). – Giorgio
Có một mô-đun tiềm ẩn cho mỗi tệp OCaml. Vì vậy, tệp của bạn 'a.ml' định nghĩa một mô-đun có tên' A'. –