Tommy M McGuire wrote:
(Plus, interact is scary. :-D )

You have a scary feeling for a moment, then it passes. ;)

Gwern Branwen wrote:
I... I want to provide a one-liner for 'detab', but it looks
impressively monstrous and I'm not sure I understand it.

On the other hand, I'm not looking for one-liners; I really want clarity as opposed to cleverness.

  tabwidth = 4

     -- tabstop !! (col-1) == there is a tabstop at column  col
     -- This is an infinite list, so no need to limit the line width
  tabstops  = map (\col -> col `mod` tabwidth == 1) [1..]

     -- calculate spaces needed to fill to the next tabstop in advance
  tabspaces = snd $ mapAccumR addspace [] tabstops
  addspace cs isstop = let cs'=' ':cs in (if isstop then [] else cs',cs')


  main = interact $ unlines . map detabLine . lines
     where
     detabLine = concat $ zipWith replace tabspaces
     replace cs '\t' = cs     -- replace with adequate number of spaces
     replace _  char = [char] -- pass through


How about that?


Regards,
apfelmus

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to