From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=AWL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by yquem.inria.fr (Postfix) with ESMTP id 5BA04BBAF for ; Thu, 26 Mar 2009 18:29:55 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApoEAP9Xy0nVuiYS/2dsb2JhbADUaweDcAY X-IronPort-AV: E=Sophos;i="4.38,426,1233529200"; d="scan'208";a="23335321" Received: from solaria.dimino.org ([213.186.38.18]) by mail2-smtp-roc.national.inria.fr with ESMTP; 26 Mar 2009 18:29:55 +0100 Received: from aurora (localhost.localdomain [127.0.0.1]) by solaria.dimino.org (Postfix) with ESMTP id C93E38004C; Thu, 26 Mar 2009 18:29:54 +0100 (CET) Received: by aurora (Postfix, from userid 1000) id 3393F446DE; Thu, 26 Mar 2009 18:29:54 +0100 (CET) Subject: Re: [Caml-list] printf "%a" vs sprintf "%a" From: =?ISO-8859-1?Q?J=E9r=E9mie?= Dimino To: Tiphaine Turpin Cc: caml-list@yquem.inria.fr In-Reply-To: <49CBB2F4.6000000@irisa.fr> References: <49CBB2F4.6000000@irisa.fr> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Date: Thu, 26 Mar 2009 18:29:54 +0100 Message-Id: <1238088594.8677.26.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.22.3.1 X-Spam: no; 0.00; printf:01 sprintf:01 printf:01 sprintf:01 foo:01 foo:01 val:01 cheers:01 wrote:01 caml-list:01 define:02 breaks:02 output:02 output:02 string:02 Tiphaine Turpin wrote: > has type string. But %a breaks this rule. Wouldn't it be simpler to have > two separate directives which accept respectively string printers and > channel printers, regardless of the outer printing function ? Note that you can do it with batteries and the new printf. The default "%a" directive always uses a channel printer: # Print.printf p"%a";; - : (unit Batteries.IO.output -> '_a -> unit) -> '_a -> unit =3D # Print.sprintf p"%a";; - : (unit Batteries.IO.output -> '_a -> unit) -> '_a -> string =3D And you can define a "%foo" directive which always uses a string printer: # let printer_foo k f x =3D k (fun out -> String.print out (f x));; val printer_as : (('a Batteries.IO.output -> unit) -> 'b) -> ('c -> string)= -> 'c -> 'b =3D # Print.printf p"%foo";; - : ('_a -> string) -> '_a -> unit =3D # Print.sprintf p"%foo";; - : ('_a -> string) -> '_a -> string =3D Cheers, J=C3=A9r=C3=A9mie