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
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.
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.
@MikeSamuel: fijo – newacct
- 1. OCaml de salida de nivel superior formateo
- 2. ocaml módulo de nivel superior de carga
- 3. OCaml de nivel superior con extensiones de sintaxis
- 4. ¿Cómo se pueden imprimir los valores de punto flotante sin formato de mantisa/exponente?
- 5. OCaml Imprimir las declaraciones
- 6. Cómo obtener valores fuera del objeto HtmlAttributes
- 7. valores de retorno OCaml
- 8. PyQt: ¿cómo obtener el nivel superior padre del widget dado?
- 9. ¿Cómo se pueden establecer los valores tipados de valores C# en NHibernate con los parámetros IQuery?
- 10. ¿Cómo enumerar solo los directorios de nivel superior en Python?
- 11. ¿Cómo imprimiría los datos en un árbol binario, nivel por nivel, comenzando en la parte superior?
- 12. enteros de nivel de tipo en ocaml
- 13. ¿Se pueden usar los valores porcentuales en XAML?
- 14. Jackson JSON: inclusión del segmento de nivel superior
- 15. ¿Cómo imprimir valores BigDecimal formateados?
- 16. Los controles de contenido deben ser controles de nivel superior
- 17. ¿Cómo imprimir los valores de depuración de Core Data?
- 18. ¿cómo se pueden obtener los atributos del elemento raíz?
- 19. disparo para valores solamente se pueden cambiar
- 20. Ant: cómo paso valores a las propiedades desde el nivel superior build.xml a build.xml en subcarpetas
- 21. ¿Qué son los clasificadores const de nivel superior?
- 22. ocaml Int y negativos valores
- 23. OCaml: valores predeterminados para los argumentos de función?
- 24. Cómo imprimir todos los valores de una matriz en Perl
- 25. ¿Cómo puedo imprimir los valores de wchar_t en la consola?
- 26. ¿Se pueden pasar los valores o parámetros al control del usuario?
- 27. Mercurial: ¿Cómo se pueden deshacer los cambios?
- 28. de orden superior constructores de tipos y funtores en Ocaml
- 29. JAVA element.getElementsByTagName Restringir a nivel superior
- 30. ¿Pueden los mensajes de websocket llegar fuera de orden?
¿no necesita el código fuente para analizar el tipo? – newacct
@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
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