Difference between revisions of "Indent"
Jump to navigation
Jump to search
DonStewart (talk | contribs) (Some ideas for an indent(1)-like tool in Haskell) |
DonStewart (talk | contribs) (Another solution) |
||
Line 58: | Line 58: | ||
===Use Language.Haskell=== |
===Use Language.Haskell=== |
||
+ | For Haskell98, this program should do the trick: |
||
− | Downside is the lack of parsing the extensions we use. And it will also |
||
+ | <haskell> |
||
− | strip comments. |
||
+ | import Language.Haskell.Parser |
||
+ | import Language.Haskell.Pretty |
||
+ | |||
+ | main = interact $ \s -> |
||
+ | case parseModule s of |
||
+ | ParseFailed loc str -> (show loc) ++ "\n" |
||
+ | ParseOk m -> (prettyPrint m) ++ "\n" |
||
+ | </haskell> |
||
+ | |||
+ | For example: |
||
+ | $ ghc -O Ppr.hs -package haskell-src |
||
+ | |||
+ | $ ./a.out < Ppr.hs |
||
+ | <haskell> |
||
+ | module Main (main) where |
||
+ | import Language.Haskell.Parser |
||
+ | import Language.Haskell.Pretty |
||
+ | main |
||
+ | = interact $ |
||
+ | \ s -> |
||
+ | case parseModule s of |
||
+ | ParseFailed loc str -> (show loc) ++ "\n" |
||
+ | ParseOk m -> (prettyPrint m) ++ "\n" |
||
+ | </haskell> |
||
+ | |||
+ | Or: |
||
+ | <haskell> |
||
+ | main = |
||
+ | let { |
||
+ | x = 7; |
||
+ | } in |
||
+ | |||
+ | return ( |
||
+ | x + x |
||
+ | ) |
||
+ | </haskell> |
||
+ | |||
+ | Becomes: |
||
+ | <haskell> |
||
+ | module Main (main) where |
||
+ | main = let x = 7 in return (x + x) |
||
+ | </haskell> |
||
[[Category:Idioms]] |
[[Category:Idioms]] |
Revision as of 23:18, 5 April 2006
Indenting Haskell Mechanically
indent(1) is a tool to format C program source. At the time of writing we have no such tool for Haskell in common use -- although this would be fairly easy to write, given the existing parsing and pretty printing libraries.
Here are some other solutions
Emacs
Emacs has an indent mode. Though it is often considered poor at laying out Haskell code.
Use GHC
GHC provides a --ddump-parsed
flag. It can be used as
follows. Note that it will strip comments -- so take care!
It will also normalise values -- so 0xdeadbeef becomes a large decimal.
main = do {
;print (f 10)
; print (f 20)
;print (f 0xdeadbeef)
}
f x = sqrt ( fromIntegral
(x * 10133123 `mod`
1231111121 :: Int ))
Running it through:
$ ghc -fno-code -ddump-parsed B.hs ==================== Parser ==================== main = do print (f 10) print (f 20) print (f 3735928559) f x = sqrt (fromIntegral ((x * 10133123) `mod` 1231111121 :: Int))
Postprocess:
$ ghc -fno-code -ddump-parsed B.hs | sed '/^===/d'
main = do print (f 10) print (f 20) print (f 3735928559) f x = sqrt (fromIntegral ((x * 10133123) `mod` 1231111121 :: Int))
Which is a reasonable result.
Use ghc-api
?
Use Language.Haskell
For Haskell98, this program should do the trick:
import Language.Haskell.Parser
import Language.Haskell.Pretty
main = interact $ \s ->
case parseModule s of
ParseFailed loc str -> (show loc) ++ "\n"
ParseOk m -> (prettyPrint m) ++ "\n"
For example:
$ ghc -O Ppr.hs -package haskell-src
$ ./a.out < Ppr.hs
module Main (main) where
import Language.Haskell.Parser
import Language.Haskell.Pretty
main
= interact $
\ s ->
case parseModule s of
ParseFailed loc str -> (show loc) ++ "\n"
ParseOk m -> (prettyPrint m) ++ "\n"
Or:
main =
let {
x = 7;
} in
return (
x + x
)
Becomes:
module Main (main) where
main = let x = 7 in return (x + x)