Personal tools

GroteTrap

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m (improved example)
(added arithmetic example)
Line 1: Line 1:
 
'''GroteTrap''' allows you to quickly define expression languages. It is [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GroteTrap available for download] on Hackage.
 
'''GroteTrap''' allows you to quickly define expression languages. It is [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/GroteTrap available for download] on Hackage.
  
An example:
+
== Example: Logic ==
  
 
<haskell>
 
<haskell>
Line 32: Line 32:
 
> readExpression logicLanguage "p && q -> r"
 
> readExpression logicLanguage "p && q -> r"
 
Impl (And [Var "p",Var "q"]) (Var "r")
 
Impl (And [Var "p",Var "q"]) (Var "r")
 +
 +
</haskell>
 +
 +
== Example: Arithmetic ==
 +
 +
<haskell>
 +
 +
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
  
 
</haskell>
 
</haskell>
  
 
[[Category:Libraries]]
 
[[Category:Libraries]]

Revision as of 13:11, 28 June 2008

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

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 "!"
      , Nary     And  True   1 "&&"
      , Nary     Or   True   2 "||"
      , Binary   Impl InfixR 3 "->"
      ]
  }

With this, we can do:

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

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