Closure elimination transformation (continuation style passing code)

Tyson Whitehead twhitehead at gmail.com
Wed May 20 00:43:00 EDT 2009


On May 19, 2009 22:17:39 Tyson Whitehead wrote:
> 2- specialize count for step = iter
>
>  <snip>
>
> 3- specializing iter for next = count
>
>  <snip>
>

I changed this just before sending it and managed to goof step two and three 
(the specializations).  The whole thing, with the correct steps two and three 
should have been the following

1- avoid forming the (iter xs) and (count i+1) closures by passing the 
function and the arguments instead of the function bound to the argument

  iter []     next i done = done
  iter (x:xs) next i done = next i x iter xs

  count i x step xs = step xs count (i+1) (i+1)

  test xs = iter xs count 0 0

2- specialize iter for next = count

  iter  []     next i done = done
  iter  (x:xs) next i done = next  i x iter xs
  iter' []          i done = done
  iter' (x:xs)      i done = count i x iter xs

  count i x step xs = step xs count (i+1) (i+1)

  test xs = iter' xs 0 0

3- specialize count for step = iter (and use the specialized iter')

  iter  []     next i done = done
  iter  (x:xs) next i done = next i x iter xs
  iter' []          i done = done
  iter' (x:xs)      i done = count' i x xs

  count  i x step xs = step  xs count (i+1) (i+1)
  count' i x      xs = iter' xs       (i+1) (i+1)

  test xs = iter' xs 0 0

(iter and count are no longer used and can be dropped at this point)

4- inline count'

  iter' []     i done = done
  iter' (x:xs) i done = iter' xs (i+1) (i+1)

  count' i x xs = iter' xs (i+1) (i+1)

  test xs = iter' xs 0 0

(count is no longer used and can be dropped at this point)

5- eliminate the done argument as it is always the same as the i argument

  iter'' []     i = i
  iter'' (x:xs) i = iter'' xs (i+1)

  test xs = iter'' xs 0

As the first one does not seem to be being performed, I did it manually to see 
if that would be enough that GHC would pickup on the rest.  It seems that this 
isn't the case.  The second two are not being done as well.

Cheers!  -Tyson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part.
Url : http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20090520/b25ec4f8/attachment.bin


More information about the Glasgow-haskell-users mailing list