caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Extending Format strings
@ 2014-07-01  9:59 Gabriel Kerneis
  2014-07-01 14:15 ` Tianyi Cui
  2014-07-01 15:27 ` Jeremie Dimino
  0 siblings, 2 replies; 7+ messages in thread
From: Gabriel Kerneis @ 2014-07-01  9:59 UTC (permalink / raw)
  To: caml-list

Dear all,

in CIL <http://cil.sf.net>, the module Pretty provides a Format-like
interface with a few extensions compared to usual format strings.
Implementation-wise, it uses string_of_format and re-implements most of
the logic of the pre-4.02 Format module, with Obj.magic all over the
place.

I wondered if anyone has done something similar in their own project
(extending Format in one way or another), and if the new GADT-based
approach could provide a cleaner solution?

One thing I quite like with the current code, despite its uglyness, is
its concision. I am right in assuming that switching to GADTs would
require a lot more boilerplate?

Many thanks for any example you could provide.

With best regards,
-- 
Gabriel

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

* Re: [Caml-list] Extending Format strings
  2014-07-01  9:59 [Caml-list] Extending Format strings Gabriel Kerneis
@ 2014-07-01 14:15 ` Tianyi Cui
  2014-07-01 14:39   ` Gabriel Kerneis
  2014-07-01 15:27 ` Jeremie Dimino
  1 sibling, 1 reply; 7+ messages in thread
From: Tianyi Cui @ 2014-07-01 14:15 UTC (permalink / raw)
  To: Gabriel Kerneis; +Cc: OCaml Mailing List

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

I found https://github.com/janestreet/custom_printf quite straightforward
to understand and easy to use, if most of your types already have sexp
converters and to_string functions.


On Tue, Jul 1, 2014 at 5:59 AM, Gabriel Kerneis <gabriel@kerneis.info>
wrote:

> Dear all,
>
> in CIL <http://cil.sf.net>, the module Pretty provides a Format-like
> interface with a few extensions compared to usual format strings.
> Implementation-wise, it uses string_of_format and re-implements most of
> the logic of the pre-4.02 Format module, with Obj.magic all over the
> place.
>
> I wondered if anyone has done something similar in their own project
> (extending Format in one way or another), and if the new GADT-based
> approach could provide a cleaner solution?
>
> One thing I quite like with the current code, despite its uglyness, is
> its concision. I am right in assuming that switching to GADTs would
> require a lot more boilerplate?
>
> Many thanks for any example you could provide.
>
> With best regards,
> --
> Gabriel
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>

[-- Attachment #2: Type: text/html, Size: 2043 bytes --]

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

* Re: [Caml-list] Extending Format strings
  2014-07-01 14:15 ` Tianyi Cui
@ 2014-07-01 14:39   ` Gabriel Kerneis
  0 siblings, 0 replies; 7+ messages in thread
From: Gabriel Kerneis @ 2014-07-01 14:39 UTC (permalink / raw)
  To: Tianyi Cui; +Cc: OCaml Mailing List

Le 2014-07-01 15:15, Tianyi Cui a écrit :
> I found https://github.com/janestreet/custom_printf [5] quite
> straightforward to understand and easy to use, if most of your types
> already have sexp converters and to_string functions.

Thanks. This is a nice hack (provided you are happy to use a 
pre-processor). However, if I understand correctly, it is limited to 
making %s and %a more convenient to use for existing Printf functions.

I should probably have given more details in my initial request. CIL's 
Pretty.dprintf [1] constructs and returns a "document" (similar to 
PPrint.document, if you are more familiar with this library), to be 
later formated and rendered to a given width. I am not sure 
custom_printf provides that level of flexibility.

[1] 
http://kerneis.github.io/cil/doc/html/cil/api/Pretty.html#VALdprintf

Best,
-- 
Gabriel

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

* Re: [Caml-list] Extending Format strings
  2014-07-01  9:59 [Caml-list] Extending Format strings Gabriel Kerneis
  2014-07-01 14:15 ` Tianyi Cui
@ 2014-07-01 15:27 ` Jeremie Dimino
  2014-07-01 16:06   ` Alain Frisch
  1 sibling, 1 reply; 7+ messages in thread
From: Jeremie Dimino @ 2014-07-01 15:27 UTC (permalink / raw)
  To: Gabriel Kerneis; +Cc: caml-list

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

On Tue, Jul 1, 2014 at 10:59 AM, Gabriel Kerneis <gabriel@kerneis.info>
wrote:

> Dear all,
>
> in CIL <http://cil.sf.net>, the module Pretty provides a Format-like
> interface with a few extensions compared to usual format strings.
> Implementation-wise, it uses string_of_format and re-implements most of
> the logic of the pre-4.02 Format module, with Obj.magic all over the
> place.
>
> I wondered if anyone has done something similar in their own project
> (extending Format in one way or another), and if the new GADT-based
> approach could provide a cleaner solution?
>
> One thing I quite like with the current code, despite its uglyness, is
> its concision. I am right in assuming that switching to GADTs would
> require a lot more boilerplate?
>

I had a quick look at [Pretty.dprintf] and I think you could use
[CamlinternalFormat.make_printf] to implement it with 4.02. @-sequences are
already recognized by the format parser in the compiler, but it should be
compatible with [Pretty]'s syntax, you just have to interpret the
constructors differently. It should actually make the code of
[Pretty.dprintf] much simpler.

-- 
Jeremie

[-- Attachment #2: Type: text/html, Size: 1642 bytes --]

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

* Re: [Caml-list] Extending Format strings
  2014-07-01 15:27 ` Jeremie Dimino
@ 2014-07-01 16:06   ` Alain Frisch
  2014-07-02  9:27     ` Gabriel Kerneis
  0 siblings, 1 reply; 7+ messages in thread
From: Alain Frisch @ 2014-07-01 16:06 UTC (permalink / raw)
  To: Jeremie Dimino, Gabriel Kerneis; +Cc: caml-list

On 07/01/2014 05:27 PM, Jeremie Dimino wrote:
> On Tue, Jul 1, 2014 at 10:59 AM, Gabriel Kerneis <gabriel@kerneis.info
> <mailto:gabriel@kerneis.info>> wrote:
>
>     Dear all,
>
>     in CIL <http://cil.sf.net>, the module Pretty provides a Format-like
>     interface with a few extensions compared to usual format strings.
>     Implementation-wise, it uses string_of_format and re-implements most of
>     the logic of the pre-4.02 Format module, with Obj.magic all over the
>     place.
>
>     I wondered if anyone has done something similar in their own project
>     (extending Format in one way or another), and if the new GADT-based
>     approach could provide a cleaner solution?
>
>     One thing I quite like with the current code, despite its uglyness, is
>     its concision. I am right in assuming that switching to GADTs would
>     require a lot more boilerplate?
>
>
> I had a quick look at [Pretty.dprintf] and I think you could use
> [CamlinternalFormat.make_printf] to implement it with 4.02. @-sequences
> are already recognized by the format parser in the compiler, but it
> should be compatible with [Pretty]'s syntax, you just have to interpret
> the constructors differently. It should actually make the code of
> [Pretty.dprintf] much simpler.

We had a very similar issue with some internal LexiFi library, also 
using @-markers, and returning some structured document.  Jeremie's 
suggestion works very well.

The code below won't compile, but it can give you an idea on how to proceed:


let printf_k fmt_s (acc : (unit, t) CamlinternalFormat.acc) =
   let open CamlinternalFormat in
   let l = ref empty in
   let add x = l := conc !l x in
   let stack = ref [] in
   let push x = stack := (x,!l) :: !stack; l := empty in
   let err () =
     Mlfi_isdatypes.ffailwith "Mlfi_pp.printf: invalid format string %S" 
fmt_s
   in
   let pop () = match !stack with
     | (x,old) :: st -> stack := st; let nl = !l in l := old; (x,nl)
     | _ -> err ()
   in
   let rec k = function
     | Acc_string(p, s) -> k p; add (str s)
     | Acc_char(p, c) -> k p; add (str (String.make 1 c))
     | Acc_delay(p, f) -> k p; add f
     | Acc_flush p -> k p
     | Acc_invalid_arg (_, msg) -> invalid_arg msg
     | Acc_formatting_lit (p, lit) ->
         k p;
         begin match string_of_formatting_lit lit with
         | "@[" -> push (`BoxLeft 2)
         | "@]" ->
             begin match pop () with
             | (`BoxLeft k,u) -> add (indent k u)
             | _ -> err ()
             end
         | "@<" -> push `LineLeft
         | "@>" ->
             begin match pop () with
             | `LineLeft, u -> add (line u)
             | _ -> err ()
             end
         | s ->
             add (str s)
         end
     | Acc_formatting_gen (p, _) -> k p
     | End_of_acc -> ()
   in
   k acc;
   if !stack <> [] then err ();
   !l

let printf (Format (fmt, fmt_s) : ('a, unit, t, f) format4) : 'a =
   let open CamlinternalFormat in
   make_printf (fun () acc -> printf_k fmt_s acc) () End_of_acc fmt


-- Alain

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

* Re: [Caml-list] Extending Format strings
  2014-07-01 16:06   ` Alain Frisch
@ 2014-07-02  9:27     ` Gabriel Kerneis
  2014-07-02 13:34       ` Gabriel Scherer
  0 siblings, 1 reply; 7+ messages in thread
From: Gabriel Kerneis @ 2014-07-02  9:27 UTC (permalink / raw)
  To: Alain Frisch; +Cc: Jeremie Dimino, caml-list

Alain, Jérémie,

On Tue, Jul 01, 2014 at 06:06:44PM +0200, Alain Frisch wrote:
> We had a very similar issue with some internal LexiFi library, also
> using @-markers, and returning some structured document.  Jeremie's
> suggestion works very well.

Many thanks for your insights. I'll probably not update CIL code in the
short term, for backwards-compatibility reasons (I'm a little nervous
when it comes to using internal compiler libs), but it's nice to see it
can be done more cleanly than the current implementation.

Best,
-- 
Gabriel

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

* Re: [Caml-list] Extending Format strings
  2014-07-02  9:27     ` Gabriel Kerneis
@ 2014-07-02 13:34       ` Gabriel Scherer
  0 siblings, 0 replies; 7+ messages in thread
From: Gabriel Scherer @ 2014-07-02 13:34 UTC (permalink / raw)
  To: Gabriel Kerneis; +Cc: Alain Frisch, Jeremie Dimino, caml-list

> (I'm a little nervous when it comes to using internal compiler libs)

As you should be: there is no guarantee of forward-compatibility of
the format GADTs -- in fact there is a strong confidence of
*non*-compatibility with 4.03.

On Wed, Jul 2, 2014 at 11:27 AM, Gabriel Kerneis <gabriel@kerneis.info> wrote:
> Alain, Jérémie,
>
> On Tue, Jul 01, 2014 at 06:06:44PM +0200, Alain Frisch wrote:
>> We had a very similar issue with some internal LexiFi library, also
>> using @-markers, and returning some structured document.  Jeremie's
>> suggestion works very well.
>
> Many thanks for your insights. I'll probably not update CIL code in the
> short term, for backwards-compatibility reasons (I'm a little nervous
> when it comes to using internal compiler libs), but it's nice to see it
> can be done more cleanly than the current implementation.
>
> Best,
> --
> Gabriel
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs

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

end of thread, other threads:[~2014-07-02 13:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-01  9:59 [Caml-list] Extending Format strings Gabriel Kerneis
2014-07-01 14:15 ` Tianyi Cui
2014-07-01 14:39   ` Gabriel Kerneis
2014-07-01 15:27 ` Jeremie Dimino
2014-07-01 16:06   ` Alain Frisch
2014-07-02  9:27     ` Gabriel Kerneis
2014-07-02 13:34       ` Gabriel Scherer

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