2011-08-31 11 views
13

OCaml repl ("toplevel") tiene una rica impresión para cualquier tipo, definido por el usuario o de otro modo. ¿Es posible acceder a esta funcionalidad fuera de toplevel, en lugar de tener que escribir un conjunto de impresoras de valores totalmente personalizadas para el conjunto completo de tipos propios?¿Cómo se pueden imprimir los valores OCaml fuera del nivel superior?

Respuesta

11

La instalación de impresión bonita es parte de la biblioteca toplevel. Encontrará la fuente en toplevel/genprintval.ml. Es comprensible, teniendo en cuenta que necesita información de tipo: no se puede simplemente arrojar ningún valor, la elección de la impresora bonita se basa en el tipo.

Si desea utilizar este código en su programa, necesitará vincularlo con la biblioteca toplevel (toplevellib.cma) o compilar en genprintval (lo que significa traer suficientes bits del tipo de verificador para analizar el tipo, puede hacerse bastante grande).

Hay una instalación similar (pero no comparto el código, creo) en el depurador (debugger/printval.ml y debugger/loadprinter.ml).

Existen bibliotecas de terceros con las que puede establecer un enlace directo y que ofrecen unas instalaciones de impresión bonitas. Extlib 's Std.dump proporciona una facilidad muy cruda (no se basa en el tipo). Deriving por Jeremy Yallop y Jake Donham es otro enfoque. This Caml Weekly News item ofrece más sugerencias.

+0

¿no necesita el código fuente para analizar el tipo? – newacct

+1

@newacct Sí, necesita la información del tipo, que el compilador descarta (pero está disponible para el toplevel o el depurador). Las bibliotecas de terceros proporcionan formas ligeras de escribir una impresora bonita específica de tipo para cada tipo, no una forma de escribir una impresora bonita genérica dependiente del tipo. Hay extensiones de lenguaje que permiten genéricos, pero no hay implementación lista para producción AFAIK. – Gilles

+1

por el momento, al menos, 'Extlib.Std.dump' y' BatPervasives.dump', mencionados por @newacct, tienen la misma función: 'Extlib.Std.dump == BatPervasives.dump ;;' => 'bool = verdadero'. – Mars

10

La biblioteca OCaml Batteries Included contiene la función dump en su módulo BatPervasives. Convierte cualquier valor en una cadena y lo devuelve. Puede ver su código fuente here. La salida no será idéntica a la de toplevel, porque parte de la información se pierde en el tiempo de ejecución, p. los constructores de tipos de datos abstractos se convertirán en enteros.

+0

@MikeSamuel: fijo – newacct

Cuestiones relacionadas