Version française
Home     About     Download     Resources     Contact us    
Browse thread
Format: Fortran (&c.) style continuation lines?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Martin Jambon <martin.jambon@e...>
Subject: Re: [Caml-list] Format: Fortran (&c.) style continuation lines?
Thorsten Ohl (TP2) wrote:
> Hi,
> 
> for ages, I've been using the following (somewhat hackish) approach to
> pretty printing source code that requires special lexical markers to
> allow statements that continue over more than one line.  (e.g. in
> Fortran
> 
>   foo = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 &
>      + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 &
>      + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 &
>      + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 &
>      + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 &
>      + 1 + 1 + 1 + 1 + 1 + 1 + 1
> 
> and in /bin/sh we have the same with "\\" instead of "&"):
> 
>   open Format;;
> 
>   let continuing = ref true;;
> 
>   let wrap_newline () =
>     let out, flush, newline, space = get_all_formatter_output_functions
>     () in
>     let newline' () =
>       if !continuing then
>         out " &" 0 2;
>       newline () in
>     set_all_formatter_output_functions out flush newline' space;;
> 
>   let nl () =
>     continuing := false;
>     print_newline ();
>     continuing := true;;
> 
>   let _ =
>     wrap_newline ();;
> 
>   (* Nonsensical example: *)
>   for statement = 1 to 3 do
>     printf "  @[<2>foo = 1";
>     for i = 1 to 100 do
>       printf "@, + 1"
>     done;
>     nl ()
>   done;;
> 
> The requirement to end each statement with "nl ()" is tedious in real
> world applications and the use of the global variable "continuing"
> violates my sense of aesthetics...
> 
> Is there a more idiomatic approach that I'm missing?

Given the imperative nature of the Format module interface, your solution
seems right to me.  Maybe you'll output up to 2 bytes beyond the margin but I
guess that's ok.

You may also consider using easy-format, which offers a functional interface
on top of Format.  The programmer's job is to create a tree containing strings
and parameters while the actual printing is done by a single function call.
That said, easy-format does not support custom newline strings although I
could add the feature.  Link:  http://martin.jambon.free.fr/easy-format.html


Martin

-- 
http://mjambon.com/