2011-01-30 30 views
8

Tôi có một sự cố Cố định cấu trúc dữ liệu (loại tóm tắt lỗi (Tùy chỉnh)). Có một loại trừu tượng được sử dụng, cụ thể là Big_int. Tuy nhiên, Marshal vẫn ổn. Không có mã C tùy chỉnh trong ứng dụng. Ngoài Nums, thư viện Unix cũng được sử dụng (tuy nhiên tôi không tin rằng có bất kỳ đối tượng hoạt động nào thuộc loại đó). Chúng tôi đang Marshal'ing với đóng cửa.Loại thư viện chuẩn nào của OCaml không thể được sắp xếp lại?

Hai (chỉ) thư viện của bên thứ ba đang được sử dụng: Lược đồ OCS (Trình thông dịch lược đồ, Ocaml tinh khiết) và Dypgen (trình phân tích cú pháp GLR mở rộng, cũng là Ocaml thuần túy). Vấn đề là với một tính năng mới của Dypgen, lưu một trình phân tích cú pháp mở rộng động.

Thông báo lỗi Ocaml bên cạnh vô dụng (nó không xác định loại trừu tượng nào với thẻ Tùy chỉnh là thủ phạm).

Chúng tôi nghi ngờ Lexbuf là thủ phạm vì nó chứa một đóng cửa trên một kênh Ocaml, và không thể được Marshal'ed, nhưng có vẻ như đây không phải là vấn đề. Vì vậy, câu hỏi của tôi là:

Thành phần thư viện chuẩn nào không thể là Marshall'd?

Trả lời

7

Không thể sắp xếp các mảng yếu. Tôi không quen thuộc với OCS Scheme, nhưng tôi sẽ mong đợi một thông dịch viên cho một ngôn ngữ thu thập rác thải được viết bằng OCaml để sử dụng các con trỏ yếu (chúng cho phép bạn truy cập vào quản lý bộ nhớ của OCaml).

Trong phòng thủ của OCaml, tôi không nghĩ rằng khối Phương thức tùy chỉnh chứa tên của loại (theo phản hồi, điều đó có vẻ như là một điều tốt để có).

EDIT: Yep:

$ grep Weak ~/Downloads/ocs-1.0.3/src/*.ml 
/Users/pascal/Downloads/ocs-1.0.3/src/ocs_sym.ml:module SymTable = Weak.Make (HashSymbol) 

EDIT2: Như đã chỉ ra bởi ygrek, có chỗ cho một tên trong khối phương pháp tùy chỉnh. Tôi cũng nên làm rõ rằng các mảng yếu không phải là giá trị tùy chỉnh, vì câu trả lời của tôi dường như ngụ ý điều đó. Các mảng yếu có thẻ Abstract và được ghép bằng cách sử dụng từ dữ liệu đầu tiên để bộ thu gom rác có thể đi qua chúng trong các giai đoạn đặc biệt liên quan đến con trỏ yếu của chu kỳ thu thập.

+2

Giá trị tùy chỉnh có thể có con trỏ để đặt tên trong custom_ops (được sử dụng làm thẻ marshalling). – ygrek

+0

Hm, vậy điều gì sẽ xảy ra nếu bạn cố gắng Soạn một mảng yếu? Tôi chắc chắn nhận được (Custom) trong chẩn đoán. – Yttrill

+1

@Yttrill "Marshal.to_string (Yếu. 3) [] ;;". Kết quả: "Ngoại lệ: Invalid_argument" output_value: giá trị trừu tượng (Tóm tắt) " –

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