On Nov 17, 2007 3:04 PM, apfelmus <apfelmus@quantentunnel.de> wrote:

Unfortunately, I don't have Paulson's book (or any other ML book :) at
home. I'm too lazy to figure out the specification from the source code,

I guess the code is too opaque, as my colleague claimed.

The layout the algorithm generates condensed indented blocks.  Within a block, it inserts a newline when the distance to the next break point plus the current position is greater than the space remaining on the current line.   Thus if S-Expression lists are rendered as blocks with indent two, and every element in a list is separated by a break point of length one, with the proper margin, you would see:

(defthingy name-of-thingy
  (one thing) (two thing)
  (a-big-thing-made-bigger)
  (three thing) (four thing))

As an exercise, the book asks you to implement group indent, where if any break point in a group inserts a newline, they all do.  So with that layout, one would get:

(defthingy
  name-of-thingy
  (one thing)
  (two thing)
  (a-big-thing-made-bigger)
  (there thing)
  (four thing))

The C version I wrote supports this layout, but I didn't bother with that extension for the Haskell version.

On the strictness annotations, my reasons for them are the usual ones, primarily to prevent memory leaks due to dragging, but a performance boost is always welcome.  At some point, I plan to profile the code with and without the annotations, and find out where they are needed.

John