2010-12-15 13 views
7

Si ejecuto el siguiente nivel superior de OCaml en:OCaml de salida de nivel superior formateo

#require "num";; 
open Ratio;; 

ratio_of_int 2;; 

La salida es:

- : Ratio.ratio = <ratio 2/1> 

¿Cómo es un formato como esto posible? El sources me dice que Ratio.ratio es un registro. Así que la salida debe ser más afín a

{numerator = <big_int 2>; denominator = <big_int 1>; normalized = true} 

Intenté ver si la salida es de alguna manera la relación codificada de nivel superior, pero esta búsqueda fue infructuosa. Como soy nuevo en OCaml, debo preguntar si me estoy perdiendo algo importante. En un lenguaje que ha sobrecargado los funcs de stringificación esto no sería extraño, pero en el caso de OCaml encuentro este comportamiento bastante fuera de lugar.

Respuesta

6

Findlib tiene una bonita impresora específicamente para el módulo de relación. En lugar de imprimir <abstr> (la interfaz no expone el registro), imprime lo que vio. Si quieres comprobarlo, mira findlib/num_top_printers.ml:

let ratio_printer fmt v = 
    Format.fprintf fmt "<ratio %s>" (Ratio.string_of_ratio v) 
+0

Sí, acabo de descifrar esto mientras reflexionaba sobre su (ahora borrada) pregunta. ¡Gracias por tu ayuda! – Rutherford

+0

Sí, estaba confundido al principio porque no tenía findlib instalado en mi computadora en el trabajo. Sabía que se debía a una bonita impresora, pero no sabía dónde estaba ubicada la linda impresora hasta que me di cuenta de que era findlib. –

+1

Parece que usar [impresoras bonitas personalizadas en topplevel] (http://caml.inria.fr/pub/docs/manual-ocaml/manual023.html#toc90) es bastante fácil. – Rutherford

3

El nivel superior tiene una directiva #install_printer, que tiene una función para imprimir cualquier tipo.

Por ejemplo, puede volver a definir cómo imprimir números enteros como esto:

let print_integer ppf n = Format.fprintf ppf "Integer(%d)" n 
#install_printer print_integer 

#install_printer elige impresoras en función del tipo de la función dada como argumento (en este caso, Format.formatter -> int -> unit).

Cuestiones relacionadas