Realidades Paralelas

Sunday, November 06, 2005

Brincando com Haskell, parte 1

Estou experimentando agora com sistemas de inferência de tipos, começando com um Hindley-Milner clássico, escrevendo o código em Haskell. Claro que para experimentar eu precisava de uma linguagem funcional simples, mas desta vez resolvi não ficar apenas na sintaxe abstrata: criar um parser e coisa e tal para poder escrever programas num formato razoável. Isso me levou a usar o Parsec, biblioteca de combinadores de parsers. Já tinha ficado impressionado antes vendo alguns exemplos, mas nunca tinha usado de verdade. E, realmente, é muito bom de usar, pelo menos para uma linguagem simples. O trabalho é feito definindo parsers algebricamente, de uma forma que espelha quase perfeitamente a forma da gramática em BNF. A documentação no site também ajuda bastante, tendo exemplos e casos de uso interessantes. Nada de usar um processador separado para gerar um parser quase incompreensível.

Como um pequeno exemplo, aqui está a definição que analisa a expressão condicional:


conditional :: Parser Exp
conditional = do reserved "if"
e1 <- expr
reserved "then"
e2 <- expr
reserved "else"
e3 <- expr
return (If e1 e2 e3)


Isso significa que o parser vai procurar pela palavra reservada if, depois chamar o parser para expressões para analisar a expressão booleana do condicional, depois procura a palavra reservada then, e por aí vai. Outro exemplo interessante é um analisador parcial para expressões básicas (que podem aparecer como fatores de expressões com operadores):


baseExp :: Parser Exp
baseExp = letexpr <|> conditional <|> variable <|> numberLiteral <|>
booleanLiteral <|> parens expr
"basic expression"


Isso mostra de maneira bem clara que uma expressão de base é uma expressão let, um condicional, uma variável, um literal (numérico ou booleano) ou uma expressão entre parênteses. Cada um desses como letexpr que são operados com <|> são parsers de algum tipo de expressão. O operador <?> permite que o parser seja descrito, para ajudar na composição de mensagens de erro significativas.

0 Comments:

Post a Comment

<< Home