2011-01-30 5 views
8

Tengo un error Alinear una estructura de datos (tipo de error abstracto (Personalizado)). Hay un tipo abstracto conocido en uso, a saber, Big_int. Sin embargo, eso Marshals bien. No hay un código C personalizado en la aplicación. Además de Nums, también se usa la biblioteca de Unix (sin embargo, no creo que haya ningún objeto activo de ese tipo). Estamos mariscalizando con Closures.¿Qué tipos de biblioteca estándar de OCaml no se pueden ordenar?

Dos (solo) bibliotecas de terceros están en uso: OCS Scheme (intérprete de esquema, Ocaml puro) y Dypgen (analizador de GLR extensible, también Ocaml puro). El problema es con una nueva característica de Dypgen, guardando un analizador extendido dinámicamente.

El mensaje de error Ocaml es inútil (no identifica qué tipo de resumen con la etiqueta personalizada es el culpable).

Sospechamos Lexbuf como el culpable porque contiene un cierre sobre un canal Ocaml, y no puede ser Marshal'ed, pero parece que este no es el problema. Entonces mi pregunta es:

¿Qué componentes de la biblioteca estándar no pueden ser Marshall?

Respuesta

7

Las matrices débiles no se pueden calcular. No estoy familiarizado con OCS Scheme, pero esperaría que un intérprete de un lenguaje recogido de basura escrito en OCaml use punteros débiles (le permiten utilizar la administración de memoria de OCaml).

En defensa de OCaml, no creo que el bloque de método personalizado contenga el nombre del tipo (retrospectivamente, eso parece algo bueno tener).

EDIT: Sí:

$ 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: como ha señalado Ygrek, hay espacio para un nombre en el bloque método personalizado. También debería aclarar que las matrices débiles no son valores personalizados, ya que mi respuesta parecía implicar eso. Las matrices débiles tienen la etiqueta Resumen y están encadenadas usando la primera palabra de datos para que el recolector de basura pueda atravesarlas en fases especiales relacionadas con el puntero débil del ciclo de recolección.

+2

Los valores personalizados pueden tener un puntero para nombrar en custom_ops (utilizado como etiqueta de clasificación). – ygrek

+0

Hm, entonces, ¿qué ocurre si intentas ordenar una matriz débil? Definitivamente estoy recibiendo (personalizado) en el diagnóstico. – Yttrill

+1

@Yttrill "Marshal.to_string (Weak.create 3) [] ;;". Resultado: "Excepción: Invalid_argument" output_value: abstract value (Abstract) " –

Cuestiones relacionadas