caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* ifprint and format type question
@ 2008-04-23 20:42 Brian Hurt
  2008-04-24  8:39 ` [Caml-list] " Nicolas Pouillard
  0 siblings, 1 reply; 2+ messages in thread
From: Brian Hurt @ 2008-04-23 20:42 UTC (permalink / raw)
  To: caml-list

So, I'm trying to write code like (simplifying):

let my_output (_: string) = ();; (* the real code is much more 
complicated but not relevant *)

let foo b fmt =
    if not b then
       Printf.ifprintf () fmt
    else
       Printf.ksprintf my_output fmt
;;

The problem is that the above code doesn't compile- ifprintf wants fmt 
to be ('b, unit, unit) format = ('b, unit, unit, unit) format4, while 
ksprintf wants it to be ('b, unit, string, 'a) format4.  Now, I could do 
the above like:

let foo b fmt =
    Printf.ksprintf (fun s -> if b then my_output s) fmt

but the point and purpose of using ifprintf is to avoid the cost of 
converting the arguments to strings that are just going to be thrown away.

So, my questions are:

1: is there a way to make this work without using Obj.magic or 
rewritting isprintf?

2: is there a reason ifprintf has the type 'a -> ('b, 'a, unit) format 
-> 'b, instead of ('b, 'a, 'c) format -> 'b, or better yet ('b, 'a, 'c, 
'd) format4 -> 'b, or even better yet ('b, 'a, 'c, 'd, 'e, 'f) format6 
-> 'b (allowing it to unify with more different formats)?

3: Does ifprintf actually avoid the cost of converting it's arguments to 
strings?  The code is unclear.  If the answer to this is 'no', the other 
two questions are moot.

Brian


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] ifprint and format type question
  2008-04-23 20:42 ifprint and format type question Brian Hurt
@ 2008-04-24  8:39 ` Nicolas Pouillard
  0 siblings, 0 replies; 2+ messages in thread
From: Nicolas Pouillard @ 2008-04-24  8:39 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Caml_mailing list

[-- Attachment #1: Type: text/plain, Size: 1844 bytes --]

Excerpts from Brian Hurt's message of Wed Apr 23 22:42:45 +0200 2008:
> So, I'm trying to write code like (simplifying):
> 
> let my_output (_: string) = ();; (* the real code is much more 
> complicated but not relevant *)
> 
> let foo b fmt =
>     if not b then
>        Printf.ifprintf () fmt
>     else
>        Printf.ksprintf my_output fmt
> ;;

ifprintf works well with fprintf

let foo b fmt =
   if not b then
      Printf.ifprintf oc fmt
   else
      Printf.fprintf oc fmt
;;

Otherwise  using  Format.ifprintf  could help due to its generalized notion of
formatter.

> The problem is that the above code doesn't compile- ifprintf wants fmt 
> to be ('b, unit, unit) format = ('b, unit, unit, unit) format4, while 
> ksprintf wants it to be ('b, unit, string, 'a) format4.  Now, I could do 
> the above like:
> 
> let foo b fmt =
>     Printf.ksprintf (fun s -> if b then my_output s) fmt
> 
> but the point and purpose of using ifprintf is to avoid the cost of 
> converting the arguments to strings that are just going to be thrown away.

Yes this defeats the purpose.

> So, my questions are:
> 
> 1: is there a way to make this work without using Obj.magic or 
> rewritting isprintf?

With Printf.ksprintf I would say no.

> 2: is there a reason ifprintf has the type 'a -> ('b, 'a, unit) format 
> -> 'b, instead of ('b, 'a, 'c) format -> 'b, or better yet ('b, 'a, 'c, 
> 'd) format4 -> 'b, or even better yet ('b, 'a, 'c, 'd, 'e, 'f) format6 
> -> 'b (allowing it to unify with more different formats)?

Hum there perhaps room for a more general ifprintf.

> 3: Does ifprintf actually avoid the cost of converting it's arguments to 
> strings?  The code is unclear.  If the answer to this is 'no', the other 
> two questions are moot.

Yes it does avoid the cost of converting it's arguments.

-- 
Nicolas Pouillard aka Ertai

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 194 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2008-04-24  8:39 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-04-23 20:42 ifprint and format type question Brian Hurt
2008-04-24  8:39 ` [Caml-list] " Nicolas Pouillard

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