2010-12-15 23 views
7

Wenn ich folgende in OCaml der Toplevel execute:OCaml Toplevel Ausgabeformatierung

#require "num";; 
open Ratio;; 

ratio_of_int 2;; 

Die Ausgabe lautet:

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

Wie ist eine Formatierung wie das möglich? Die sources sagen Sie mir, dass Ratio.Ratio ist ein Rekord. So ist die Ausgabe an

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

eher sein soll, habe ich versucht, ob Verhältnis Ausgang irgendwie in Toplevel fest einprogrammiert ist, aber diese Suche war ergebnislos. Da ich neu bei OCaml bin, muss ich fragen, ob ich etwas Wichtiges vermisse? In einer Sprache mit überladenen Stringifikations-Funktionen wäre das nicht komisch, aber in OCamls Fall finde ich dieses Verhalten ziemlich fehl am Platz.

Antwort

6

Findlib hat einen hübschen Drucker speziell für das Verhältnismodul. Anstatt <abstr> auszudrucken (die Schnittstelle legt den Datensatz nicht frei), wird gedruckt, was Sie gesehen haben. Wenn Sie es heraus überprüfen möchten, schauen Sie sich findlib/num_top_printers.ml:

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

Ja, ich habe gerade herausgefunden, während Sie über Ihre (jetzt gelöschte) Frage nachdenken. Danke für Ihre Hilfe! – Rutherford

+0

Ja, ich war zuerst verwirrt, weil ich findlib nicht auf meinem Computer bei der Arbeit installiert hatte. Ich wusste, dass es an einem hübschen Drucker lag, wusste aber nicht, wo sich der hübsche Drucker befand, bis ich merkte, dass es findlib war. –

+1

Scheint wie die Verwendung von [benutzerdefinierte hübsche Drucker in Toplevel] (http://caml.inria.fr/pub/docs/manual-ocaml/manual023.html#toc90) ist ziemlich einfach. – Rutherford

3

Die Toplevel hat eine Richtlinie #install_printer, die eine Funktion jeder Art drucken nimmt.

Zum Beispiel können Sie neu zu definieren, wie ganze Zahlen wie folgt drucken:

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

#install_printer wählen Drucker je nach Art der Funktion als Argument angegeben (hier Format.formatter -> int -> unit).