Browse thread
Re: [Caml-list] Polymorphic pretty printing
- Frédéric_Gava
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 2004-11-26 (22:53) |
From: | Frédéric_Gava <frederic.gava@w...> |
Subject: | Re: [Caml-list] Polymorphic pretty printing |
Hi, I have test and it is possible. Daniel de Rauglaudre wrote in >From: Daniel de Rauglaudre <daniel.de_rauglaudre@inria.fr> >Date: Fri, 25 Jan 2002 06:58:14 +0100 "Another example is the "revised syntax" of Camlp4 in the OCaml sources, file "camlp4/top/rprint.ml". (use "camlp4r pr_o.cmo camlp4/top/rprint.ml" to see this file in normal syntax, if you prefer). " Take the function "print_out_value" of camlp4r pr_o.cmo camlp4/top/rprint.ml" , modify it (it is easy, the code is very clear) for your application and run : Toploop.print_out_value := print_out_value. Do not forget do modify "True" to "true" (idem for "False") to have a correct printing of Ocaml values. I have type 'a vec = Vector of 'a array and I modify 'print_out_value" to print vector as <...,...,...> and (Vector (Array.init 3 (fun i->i)), Vector (Array.init 3 (fun i->i))) prints (<0,1,2>, <0,1,2>) without problem and I do not have modify at all the toplevel. Cheers, Frédéric Gava >----- Original Message ----- >From: "Christophe TROESTLER" <debian00@tiscali.be> >To: <Andrej.Bauer@andrej.com> >Cc: "O'Caml Mailing List" <caml-list@inria.fr> >Sent: Friday, October 22, 2004 11:07 PM >Subject: Re: [Caml-list] Polymorphic pretty printing > On Mon, 18 Oct 2004, Andrej Bauer <Andrej.Bauer@andrej.com> wrote: > > > > how to install a pretty printer for a _polymorphic_ type. > > http://caml.inria.fr/archives/200201/msg00234.html > > > > I should use Toplevel.print_out_value to do this. But, > > print_out_value expects an arguments of type Outcometree.out_value, > > and it is not clear to me where I will get it. > > Since you will register a new printing function, you will not have to > get it, Outcometree.out_value will be provided to your function! To > get you a flavor of how (I understand) it works, here is some code: > > let oldpp = !Toploop.print_out_value > let pp f o = > (match o with > | Outcometree.Oval_list _ -> > Format.fprintf f "list:" > | _ -> ()); > oldpp f o > Toploop.print_out_value := pp > > Now, a list is written as > > # [1;2];; > - : int list = list:[1; 2] > > > Am I supposed to rewrite half of toplevel.ml to get this working? > > I am afraid that the awser is yes :(. Let's see why: > > # ([1; 2], 2);; > - : int list * int = ([1; 2], 2) > > Now the above [pp] pretty printer is registered but it does not to > work. This is because the original function registered in > [Toploop.print_out_value] is recursive instead of calling > [!Toploop.print_out_value] (there is certainly a reason but I do not > know it) -- thus since the "top" structure is a couple, [oldpp] is > called and never calls back [pp]. > > Therefore, not only we have to duplicate all the code of the original > [!Toploop.print_out_value] (and check conformance at every upgrade) > but that also means it is difficult for several polymorphic pretty > printers to cooperate. > > This is really unfortunate as this prevents libraries to use > [Sys.interactive] in order to install pretty printers for their > polymorphic types. > > Hope a nice solution can be designed for this last usage. > > Cheers, > ChriS > > ------------------- > To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr > Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners