[Haskell-cafe] How to pretty print code efficiently

John Ky newhoggy at gmail.com
Sun Jul 5 23:35:44 EDT 2009


Hi all,

Thanks everyone for the help.  The HughesPJ module works well for me.

Cheers,

-John

On Mon, Jul 6, 2009 at 3:49 AM, Chris Eidhof <chris at eidhof.nl> wrote:

> On 4 jul 2009, at 05:13, Alexander Dunlap wrote:
>
>  On Fri, Jul 3, 2009 at 6:45 PM, John Ky<newhoggy at gmail.com> wrote:
>>
>>> Hi,
>>>
>>> Currently I'm pretty printing code by building arrays of strings and
>>> calling
>>> indent.  For example:
>>>
>>> instance JavaPrintableNamed AST.EnumeratedType where
>>>   javaLinesNamed parentName (AST.EnumeratedType memberDefinitions) =
>>>      [ "public enum " ++ asJavaId(parentName)
>>>      , "{"
>>>      ] ++ memberCodeLines ++
>>>      [ "}"
>>>      , ""
>>>      ]
>>>      where
>>>         memberCodeLines = indent $ javaLines memberDefinitions
>>>
>>> The indent function takes a list of strings and adds an indent to the
>>> beginning of every line.
>>>
>>> I can imagine this to be very inefficient as it builds many strings and
>>> concatenates them.
>>>
>>> In Ruby, I might do the same thing like this:
>>>
>>> class EnumeratedType < JavaPrintableNamed
>>>   def writeTo(writer)
>>>      writer.print "public enum "
>>>      writer.puts self.asJavaId
>>>      writer.puts "{"
>>>      writer.indent do
>>>         self.memberDefinitions.writeTo(writer)
>>>         writer.puts
>>>      end
>>>
>>> where above, the writer.indent takes care of the indent, and everything
>>> is
>>> appended to a stream, which doesn't seem so bad in terms of efficiency.
>>>
>>> I'm looking for a way to do something similar in Haskell.
>>>
>>> Anyone can give me a hand?
>>>
>>> Thanks
>>>
>>> -John
>>>
>>>
>>> _______________________________________________
>>>
>>
>> You may want to investigate the standard module
>> Text.PrettyPrint.HughesPJ, which contains a number of (I assume fairly
>> efficient) combinators for pretty printing.
>>
>
> I second that. Also, there is uulib which has a pretty printing module
> that's quite similar:
>
>
> http://hackage.haskell.org/packages/archive/uulib/0.9.10/doc/html/UU-PPrint.html
>
> I think both packages are based on the paper "The Design of a
> Pretty-printing Library" which can be found at
> http://www.cs.chalmers.se/~rjmh/Papers/pretty.ps<http://www.cs.chalmers.se/%7Erjmh/Papers/pretty.ps>
>
> Not only do they provide abstractions for things like indentation,
> concatenation in different forms, etc., but they also are  more efficient
> than a naive implementation using lists.
>
> -chris
>
> -chris
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20090705/a395386a/attachment.html


More information about the Haskell-Cafe mailing list