2011-01-30 11 views
8

Mam awarię Marshaling struktury danych (typ abstrakcyjnego błędu (niestandardowy)). Istnieje jeden znany typ abstrakcyjny, a mianowicie Big_int. Jednak Marszałkowie w porządku. W aplikacji nie ma niestandardowego kodu C. Oprócz Numsa wykorzystywana jest również biblioteka Unix (jednak nie sądzę, że istnieją jakiekolwiek aktywne obiekty tego typu). Jesteśmy marszałkami z Closures.Jakie typy bibliotek standardowych OCaml nie mogą zostać ustawione?

Używane są dwie (jedyne) biblioteki stron trzecich: Schemat OCS (Scheme interpreter, czysty Ocaml) i Dypgen (rozszerzalny parser GLR, także czysty Ocaml). Problem polega na nowej funkcji Dypgen, zapisując dynamicznie rozszerzony analizator składni.

Komunikat o błędzie Ocaml jest bezużyteczny (nie określa, który typ abstrakcyjny z niestandardowym znacznikiem jest winowajcą).

Podejrzewaliśmy, że Lexbuf jest winowajcą, ponieważ zawiera zamknięcie nad kanałem Ocaml i nie może być marszałkiem, ale wygląda na to, że to nie problem. Moje pytanie brzmi:

Które standardowe komponenty biblioteki nie mogą być składnikami Marshalla?

Odpowiedz

7

Słabe tablice nie mogą być marszałkami. Nie znam schematu OCS, ale spodziewałbym się, że tłumacz dla języka śmieciowego zapisanego w OCaml użyje słabych wskaźników (pozwolą ci na odzyskanie pamięci o zarządzaniu pamięcią OCaml).

W obronie OCamla, nie sądzę, że blok metody Custom zawiera nazwę typu (retrospektywnie, wydaje się, że to dobrze mieć).

EDIT: Tak:

$ 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: Jak podkreślił Ygrek, jest miejsce dla nazwy w bloku metody niestandardowej. Powinienem również wyjaśnić, że słabe tablice nie są wartościami niestandardowymi, ponieważ moja odpowiedź wydawała się to sugerować. Słabe tablice mają znacznik Abstract i są powiązane za pomocą pierwszego słowa danych, tak aby garbage collector mógł je przechodzić w specjalnych fazach cyklu związanych ze słabymi wskaźnikami.

+2

Wartości niestandardowe mogą mieć wskaźnik do nazwy w custom_ops (używane jako znacznik rozrządowy). – ygrek

+0

Hm, więc co się stanie, jeśli spróbujesz Marszałka słabą tablicą? Zdecydowanie dostaję (Custom) w diagnostyce. – Yttrill

+1

@Yttrill "Marshal.to_string (Weak.create 3) [] ;;". Wynik: "Exception: Invalid_argument" output_value: abstract value (Abstract) " –

Powiązane problemy