2011-01-30 3 views
8

데이터 구조를 마샬링하는 데 오류가 있습니다 (오류 추상 형식 (사용자 지정)). 사용되는 알려진 추상 유형은 Big_int입니다. 그러나 마샬은 괜찮습니다. 응용 프로그램에는 사용자 지정 C 코드가 없습니다. Nums 외에도 Unix 라이브러리도 사용됩니다 (그러나이 유형의 활성 객체가 있다고는 생각하지 않습니다). 우린 마샬링 오브 클로저입니다.어떤 OCaml 표준 라이브러리 유형을 정렬 할 수 없습니까?

OCS Scheme (Scheme 인터프리터, 순수 Ocaml) 및 Dypgen (확장 가능한 GLR 파서, 순수 Ocaml) 두 개의 타사 라이브러리가 사용 중입니다. 문제는 동적으로 확장 된 구문 분석기를 저장하는 Dypgen의 새로운 기능입니다.

Ocaml 오류 메시지는 쓸모가 없습니다 (사용자 정의 태그가있는 추상 유형이 범인인지 식별하지 못합니다).

우리는 Ocaml 채널을 통해 클로저를 포함하고 있기 때문에 Lexbuf가 범죄자로 의심되어 Marshaled 될 수 없지만 이것이 문제가 아닌 것으로 보입니다. 그래서 내 질문은 :

마샬 할 수없는 표준 라이브러리 구성 요소는 무엇입니까?

답변

7

약한 배열은 마샬링 될 수 없습니다. OCS Scheme에 익숙하지 않지만 OCaml로 작성된 가비지 수집 언어에 대한 통역사가 약한 포인터 (OCaml의 메모리 관리에 피기 백)를 사용할 것으로 기대합니다.

OCaml의 방위에서 나는 사용자 정의 메서드 블록에 유형의 이름이 소급되어 있다고 생각하지 않습니다 (소급해서 가지고있는 것 같습니다).

EDIT : 그래 :

$ 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 : ygrek 지적한 바와 같이, 사용자 정의 방식 블록 이름의 여지가있다. 내 대답은 그것을 암시하는 것처럼 보였으므로 약한 배열은 사용자 지정 값이 아니라는 것을 분명히해야합니다. 약한 배열은 추상 태그를 가지며 가비지 컬렉터가 수집 사이클의 특수한 약점과 관련된 단계에서이를 트래버스 할 수 있도록 데이터의 첫 번째 단어를 사용하여 연결됩니다.

+2

맞춤 값은 custom_ops (마샬링 태그로 사용)의 이름을 가리키는 포인터를 가질 수 있습니다. – ygrek

+0

흠, 약한 배열을 마샬링하려고하면 어떻게됩니까? 나는 확실히 진단에서 (Custom)을 얻고있다. – Yttrill

+1

@Yttrill "Marshal.to_string (Weak.create 3) [] ;;". 결과 : "예외 : Invalid_argument"output_value : 추상 값 (초록) " –

관련 문제