# GroteTrap

### From HaskellWiki

(Difference between revisions)

(added arithmetic example) |
(updated logicLanguage to reflect the new API) |
||

Line 17: | Line 17: | ||

{ variable = Var |
{ variable = Var |
||

, operators = |
, operators = |
||

− | [ Unary Not Prefix 0 "!" |
+ | [ Unary Not Prefix 0 "!" |

− | , Nary And True 1 "&&" |
+ | , Assoc And 1 "&&" |

− | , Nary Or True 2 "||" |
+ | , Assoc Or 2 "||" |

− | , Binary Impl InfixR 3 "->" |
+ | , Binary Impl InfixR 3 "->" |

] |
] |
||

} |
} |

## Latest revision as of 13:13, 28 June 2008

**GroteTrap** allows you to quickly define expression languages. It is available for download on Hackage.

## [edit] 1 Example: Logic

data Logic = Var String | Or [Logic] | And [Logic] | Impl Logic Logic | Not Logic deriving (Show, Eq) logicLanguage :: Language Logic logicLanguage = language { variable = Var , operators = [ Unary Not Prefix 0 "!" , Assoc And 1 "&&" , Assoc Or 2 "||" , Binary Impl InfixR 3 "->" ] }

With this, we can do:

> readExpression logicLanguage "p && q -> r" Impl (And [Var "p",Var "q"]) (Var "r")

## [edit] 2 Example: Arithmetic

arith :: Language Int arith = language { number = id , operators = [ Assoc sum 2 "+" , Binary (-) InfixL 2 "-" , Assoc product 1 "*" , Binary div InfixL 1 "/" , Binary (^) InfixL 0 "^" ] , functions = [ function1 abs "abs" ] } evalArith :: String -> Int evalArith = readExpression arith > evalArith "abs(2 - 3) + abs(4 - 5)" 2