2012-02-05 19 views
5

thư mục My chứa nhiều file, được biên soạn theo thứ tự này: global.ml, zone.ml, abs.ml, main.mlTuyên bố và biến tham khảo toàn cầu trong vài file

global.ml chứa một số biến tài liệu tham khảo (ví dụ let g1 = ref 0) cho tất cả các tập tin.

Trong zone.ml có tuyên bố let f = !g1.

Trong abs.ml, có g1 := 5, mà sẽ được điều hành bởi main vào đầu thời gian chạy, tôi coi nó như một khởi của g1 cho thời gian chạy thực bối cảnh.

Sau đó main sẽ gọi Zone.f. Thật kỳ lạ, những gì tôi nhận ra là phải mất f = 0 thay vì f = 5.

Bạn có nghĩ hành vi này là bình thường không? Nếu vậy, tôi nên thay đổi điều gì, để làm cho giá trị hiện tại của !g1 vào tài khoản?

PS: Có thể một giải pháp là tạo một hàm let f v = v trong zone.ml rồi để main gọi Zone.f !g1. Nhưng tôi có một số biến tham chiếu toàn cầu là g1 trong global.ml, tôi hy vọng chúng có thể hợp lệ trên tất cả các tệp và chức năng và tôi không muốn khiến chúng tham gia vào chữ ký của hàm.

Trả lời

6

Về cơ bản, bạn quan tâm đến thứ tự đánh giá các giá trị cấp cao nhất trong mô-đun của mình. Thứ tự xảy ra không liên quan đến thứ tự mà bạn biên dịch các tệp, mà đúng hơn là thứ tự xuất hiện khi bạn liên kết các tệp.

Nếu bạn bỏ qua ranh giới mô-đun, nếu bạn liên kết các tập tin theo thứ tự bạn đưa ra, những gì bạn có là như thế này:

let g1 = ref 0 
let f = !g1 
let() = g1 := 5 

Nó không nên ngạc nhiên khi f có giá trị 0.

Lưu ý rằng main của bạn không nhất thiết phải là điều đầu tiên xảy ra khi chạy. Các giá trị cấp cao nhất được đánh giá theo thứ tự các tệp xuất hiện khi bạn liên kết chúng. Rất phổ biến, maincuối cùng là điều cấp cao nhất xảy ra (vì tệp của nó thường là tệp cuối cùng).

(Cũng lưu ý rằng có một main ở tất cả chỉ là một quy ước, có lẽ thông qua bởi các lập trình viên C cựu như tôi. Không có yêu cầu để có một hàm có tên main. OCaml chỉ đánh giá các giá trị cấp cao nhất theo thứ tự.)

Edit:

Thật khó để nói như thế nào để cơ cấu lại mã của bạn mà không cần biết thêm về nó. Bản chất của vấn đề của bạn dường như là bạn xác định f là một giá trị bất biến cấp cao nhất trong zone.ml nhưng bạn muốn giá trị của nó theo sau g1, là giá trị có thể thay đổi.

Đề xuất đơn giản nhất là xóa định nghĩa f từ zone.ml và thay thế nó ở mọi nơi trong tệp bằng !g1.

Nếu bạn muốn giữ lại tên f ở cấp cao nhất trong zone.ml, bạn phải xác định lại nó dưới dạng giá trị không thể thay đổi. Một chức năng là sự lựa chọn rõ ràng nhất:

let f() = !g1 

Sau đó, bạn sẽ thay thế sử dụng của f trong zone.ml bởi f() để thay thế.

+0

Cám ơn nhận xét của bạn, bạn giải thích lý do tại sao nó xảy ra, nhưng bạn đã không giải thích làm thế nào để giải quyết nó ... Tôi không thể thay đổi thứ tự biên soạn những tập tin này, tôi có thể làm gì khác? – SoftTimur

+0

Tôi đã thêm ** Chỉnh sửa ** với một số đề xuất. Nhưng thật khó để biết nên đề xuất gì mà không cần biết thêm về mã của bạn. –

Các vấn đề liên quan