caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Pierre Weis <pierre.weis@inria.fr>
To: Damien.Pous@ens-lyon.fr (Damien)
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] kprintf with user formatters
Date: Wed, 14 Jul 2004 23:10:23 +0200 (MET DST)	[thread overview]
Message-ID: <200407142110.XAA25344@pauillac.inria.fr> (raw)
In-Reply-To: <20040630183237.457317c7@mostha> from Damien at "Jun 30, 104 06:32:37 pm"

Hi,

> I am writing a multi-threaded program, so that I need some
> synchronization when pretty-printing things :
[...]
> module Debug = struct
>   let m = Mutex.create()
>   let printf x = 
>   Format.kprintf 
>     (fun s -> Mutex.lock m; print_endline s; Mutex.unlock m) 
>    x
> end;;
> (*
> module Debug :  sig 
>   val m: Mutex.t
>   val printf : ('a, unit, string, unit) format4 -> 'a 
> end
> *)
> 
> but now, I can't _nicely_ use my previously defined printers :
> type t
> val format_t: Format.formatter -> t -> unit
> val x: t
> 
> I would like to write :
> <<
> Debug.printf "val t = %a" format_t x
> >>
> 
> but I cannot since the user printer is expected to be "unit->t->string"
> (while it is "formatter->t->unit" for the standard Format.printf "%a")

Your problem is thus that the function Debug.printf is not the right
one (since it has not the right type :)

Hence, you should use another definition for Debug.printf

 let printf fmt =
   Format.kfprintf (fun ppf -> ()) Format.err_formatter fmt

This way, you get:

printf "%a";;
- : (Format.formatter -> '_a -> unit) -> '_a -> unit = <fun>

as expected.

However, your problem is simpler than that: you just have to define a
custom formatter devoted to your debugging purposes. For instance:

module Debug = struct
   let m = Mutex.create ()
   let out s idx len =
     Mutex.lock m;
     prerr_string (String.sub s idx len); flush stderr;
     Mutex.unlock m
   let flush () = flush stderr
   let dppf = Format.make_formatter out flush
   let printf fmt = Format.fprintf dppf fmt
 end;;

Now you can substitute Debug.printf to any well-typed occurrence of
Format.printf, since we have:

#  Debug.printf;;
- : ('a, Format.formatter, unit) format -> 'a = <fun>
# Format.printf;;
- : ('a, Format.formatter, unit) format -> 'a = <fun>

> currently I use :
>
> let (!!) f = (fun () x -> 
>   f Format.str_formatter x;
>   Format.flush_str_formatter());;
> (* val (!!): (Format.formatter -> 'a -> 'b) -> unit -> 'a -> string *)
> 
> Debug.printf "val t = %a" !!format_t x
>
> this seems to be working, but I wonder if :
>  - there is a better solution

See above: a custom formatter is probably simpler and more elegant.

>  - this use of the global value "Format.str_formatter" is really
> 	thread-safe (I would say no...)

I'm afraid I could not answer for sure to this one: let's say that
using Format.str_formatter is as thread safe as using a Buffer.t value
and the Buffer.add_* functions.

Also, can we consider in the first place that using any printf variant
could be thread safe ? If the answer is no, you would need to stick to
pp_* versions of the basic primitives and this would be a major
modification of your code.

>  - I missed something

May be you missed the fact that Format was designed from the beginning
to support formatting in parallel to user's defined pretty-printing
engines.

>  - printf could not understand a conversion character 'A' that would
> 	always need a _general_ user-formatter (of type formatter->t->unit)

Once more, I cannot answer to this question: I need some time to
figure out what it mean in term of typing (and semantics of printf)...

Tell me if the suggested solution solves your problem.

Best regards,

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/


-------------------
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


  reply	other threads:[~2004-07-14 21:10 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-06-30 16:32 Damien
2004-07-14 21:10 ` Pierre Weis [this message]
2004-07-15  0:17   ` Markus Mottl
2004-07-15  7:30     ` David MENTRE
2004-07-15  7:59       ` Jean-Christophe Filliatre
2004-07-15 23:35         ` henri dubois-ferriere
2004-07-15  7:39     ` Damien
2004-07-15 12:19       ` Markus Mottl
2004-07-15 12:42         ` Basile Starynkevitch [local]
2004-07-15 13:45           ` Markus Mottl
2004-07-15 14:22             ` Basile Starynkevitch [local]
2004-07-15 14:57               ` Markus Mottl
2004-07-16  6:47               ` Pierre Weis
2004-07-16  7:13                 ` Jean-Christophe Filliatre
2004-07-16  7:23                   ` henri dubois-ferriere
2004-07-16  7:44                     ` Jean-Christophe Filliatre
2004-07-16 17:56                   ` Markus Mottl
2004-07-19  9:17                   ` Pierre Weis
2004-07-19  9:32                     ` Jean-Christophe Filliatre
2004-07-16  7:21                 ` henri dubois-ferriere
2004-07-16 17:44                 ` Markus Mottl
2004-07-19 10:10                   ` Pierre Weis
2004-07-19 10:43                     ` Jon Harrop
2004-07-21 15:52                       ` Pierre Weis
2004-07-21 17:43                         ` lazyness in ocaml (was : [Caml-list] kprintf with user formatters) Daniel Bünzli
2004-07-22 16:28                           ` Pierre Weis
2004-07-22 17:03                             ` William Lovas
2004-07-22 23:00                             ` skaller
2004-07-23  3:32                               ` William Lovas
2004-07-28  7:26                               ` Pierre Weis
2004-07-28  8:06                                 ` skaller
2004-07-28  8:29                                   ` Daniel Bünzli
2004-07-28  9:13                                   ` Pierre Weis
2004-07-28  9:36                                     ` skaller
2004-07-28  9:38                                     ` skaller
2004-07-28 10:17                                 ` Jason Smith
2004-07-28 12:31                                   ` skaller
2004-07-21 20:41                         ` [Caml-list] kprintf with user formatters Jon Harrop
2004-07-22 15:39                           ` Pierre Weis
2004-07-22 22:16                             ` [Caml-list] lazy evaluation: [Was: kprintf with user formatters] skaller
2004-07-22 22:42                             ` [Caml-list] kprintf with user formatters skaller
2004-07-22  8:05                         ` [Caml-list] wait instruction lehalle@miriad
2004-07-22  8:40                           ` Olivier Andrieu
2004-07-22 10:35                             ` lehalle@miriad
2004-07-22 10:33                           ` Vitaly Lugovsky
2004-07-16  6:17             ` [Caml-list] kprintf with user formatters Pierre Weis
2004-07-16 17:14               ` Markus Mottl
2004-07-19 10:00                 ` Pierre Weis
2004-07-16  6:02       ` Pierre Weis
2004-07-16  8:42         ` Damien
2004-07-19  9:00           ` Pierre Weis
2004-07-16 16:52         ` Markus Mottl
2004-07-19  9:28           ` Pierre Weis
2004-07-15 22:20     ` Pierre Weis
2004-07-15 23:01       ` Markus Mottl
2004-07-16 16:17     ` james woodyatt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200407142110.XAA25344@pauillac.inria.fr \
    --to=pierre.weis@inria.fr \
    --cc=Damien.Pous@ens-lyon.fr \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).