blob: d81fcf8b05585076b2cfc6bf266f976bf522b579 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
{-# LANGUAGE Haskell2010 #-}
{-# LANGUAGE TemplateHaskell #-}
-- Used by QuasiQuote. Example taken from the GHC documentation.
module QuasiExpr where
import Language.Haskell.TH
import Language.Haskell.TH.Quote
data Expr = IntExpr Integer
| AntiIntExpr String
| BinopExpr BinOp Expr Expr
| AntiExpr String
deriving Show
data BinOp = AddOp
| SubOp
| MulOp
| DivOp
deriving Show
eval :: Expr -> Integer
eval (IntExpr n) = n
eval (BinopExpr op x y) = (opToFun op) (eval x) (eval y)
where
opToFun AddOp = (+)
opToFun SubOp = (-)
opToFun MulOp = (*)
opToFun DivOp = div
expr = QuasiQuoter parseExprExp undefined undefined undefined
-- cheating...
parseExprExp :: String -> Q Exp
parseExprExp _ = [| BinopExpr AddOp (IntExpr 1) (IntExpr 2) |]
|