2011-07-29 9 views
38

solía escribir¿Hay un formateador de código Haskell?

data A = A { 
     a :: Double 
    } 
    deriving(Eq, Show) 

pero ahora prefiero

data A = A { 
     a :: Double 
    } deriving(Eq, Show) 

Creo que la respuesta será no, pero de todos modos lo que pido: ¿hay un formateador de código de Haskell?

+0

Unos años tarde pero existe ahora, he actualizado mi respuesta de aceptación con él. –

+0

echa un vistazo a brittany –

Respuesta

52

nueva respuesta

Ahora he escrito hindent, que está escrita en términos de haskell-src-exts. Tiene soporte Emacs y Vim.


respuesta Antiguo

No es haskell-src-exts que analizar el código y tiene un módulo de impresión bonita para la impresión de la AST en una cadena. P.ej.

import Language.Haskell.Exts 

main = interact codeFormat 

codeFormat = check . fmap reformat . parseModuleWithComments where 
    reformat = prettyPrint 
    check r = case r of 
       ParseOk a -> a 
       ParseFailed loc err -> error $ show (loc,err) 

Ejemplo:

λ> putStrLn $ codeFormat "module X where x = 1 where { y 1 = 2; y _ = 2 }" 
module X where 
x = 1 
    where y 1 = 2 
     y _ = 2 

Alternativamente, usted puede escribir una impresora bastante a sí mismo (incluso sobre la base de lo anterior, si lo que desea especializarse), y entonces usted puede tener cualquier estilo que desee. Reemplace prettyPrint con el suyo. El AST es muy directo.

Luego puede conectarlo con Emacs para volver a formatear cada vez que presione guardar o algo así.

+8

pon esto en tu ~./Ghci:: set prompt "λ>" – gawi

+0

Tu código no verifica el tipo con haskell-src-exts-1.13.5. Además, ¿hay alguna forma de imprimirlo bien incluyendo los comentarios? –

+0

el código puede verificarse si se cambia a otra función de análisis, pero parece que no hay soporte para conservar los comentarios en la fuente, solo se recopilan comentarios en una lista, no sé por qué es útil hacerlo. – Sawyer

2

Para imprimir un AST con los comentarios que se necesita ExactPrint

exactPrint :: ExactP ast => ast SrcSpanInfo -> [Comment] -> String 

pero no se exactPrint bastante imprimir sus fuentes.

He escrito a small tool puede llamarlo con Vim como formateador externo.

prettyHS :: String -> String 
prettyHS src 
    = case parseFileContentsWithComments defaultParseMode src of 
     ParseOk (ast, _) -> prettyPrint ast 
     _ -> src 
Cuestiones relacionadas