aboutsummaryrefslogtreecommitdiff
path: root/html-test/tests/QuasiExpr.hs
blob: 970759ba713708d8840e37568b899b10349c4549 (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
{-# 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) |]