Difference between revisions of "GroteTrap"

From HaskellWiki
Jump to navigation Jump to search
m (fixed error)
(updated logicLanguage to reflect the new API)
 
(2 intermediate revisions by the same user not shown)
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.
   
  +
== Example: Logic ==
An example:
 
   
 
<haskell>
 
<haskell>
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 "->"
 
]
 
]
 
}
 
}
Line 30: Line 30:
 
<haskell>
 
<haskell>
   
> readExpression logicLanguage "p && q"
+
> readExpression logicLanguage "p && q -> r"
And [Var "p",Var "q"]
+
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>

Latest revision as of 13:13, 28 June 2008

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

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")

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