Safe Haskell | None |
---|---|

Language | Haskell2010 |

Provides an instance that translates haskell-src-exts expression trees into Template Haskell expression trees in a way that depends only on the haskell-src-exts syntax tree and agreement on the pretty-printed representation of Haskell between haskell-src-exts pretty-printer and Template Haskell quotations (as opposed to depending on both TH and haskell-src-exts syntax tree representations).

Instead of converting between data types, haskell-src-exts syntax trees are pretty-printed and wrapped in a TH quotation which is then interpreted as a Haskell program, yielding a TH Exp tree. Free variables in the haskell-src-exts tree are preserved by lifting them to TH splices prior to pretty-printing.

e.g. `parseToTH "let x = 1 in x + y"`

=
```
Right (LetE [ValD (VarP x_1) (NormalB (LitE (IntegerL 1))) []]
(InfixE (Just (VarE x_1)) (VarE GHC.Num.+) (Just (VarE y))))
```

- translateExtsToTH :: Exp -> Either Exp Exp
- parseToTH :: String -> Either String Exp
- parseToTarget :: Translation s t => Witness s -> String -> Either String t
- translateTree :: Translation s t => s -> Either s t

# Documentation

translateExtsToTH :: Exp -> Either Exp Exp Source

Translate a Language.Haskell.Exts.Exp (haskell-src-exts) syntax tree to a Language.Haskell.TH.Exp (template-haskell) syntax tree

parseToTH :: String -> Either String Exp Source

Parse a string to a Language.Haskell.TH.Exp (template-haskell) expression via intermediate representation as a Exts.Exp tree.

parseToTarget :: Translation s t => Witness s -> String -> Either String t Source

Parse a string to a tree of type `t`

, via intermediate representation
as a tree of type `s`

. Requires a witness of the intermediate type `s`

to be passed as the first argument.

If parsing fails then `parseToTarget s = Left s`

, otherwise
`parseToTarget s = Right t`

where `t`

is the parsed tree.

translateTree :: Translation s t => s -> Either s t Source

Translate a tree of type `s`

to a tree of type `t`

.

If translation fails then `translate s = Left s`

, otherwise
`translate s = Right t`

where `t`

is the translated tree.