stgi-1.1: Educational implementation of the STG (Spineless Tagless G-machine)

Safe HaskellNone
LanguageHaskell2010

Stg.Parser.QuasiQuoter

Contents

Description

Quasiquoters for easier generation of STG syntax trees. The stg quoter is most convenient, I suggest you use it unless you have a reason not to.

Synopsis

Heuristic quasiquoter

stg :: QuasiQuoter Source #

Heuristic quasiquoter for STG language elements. Tries a number of parsers, and will use the first successful one.

To gain more fine-grained control over what the input should be parsed to, use one of the non-heuristic quoters, such as stgProgram or stgLambdaForm. These will also give you much better error messages than merely "doesn't work".

>>> [stg| id = \x -> x |]
Program (Binds [(Var "id",LambdaForm [] NoUpdate [Var "x"] (AppF (Var "x") []))])
>>> [stg| \x -> x |]
LambdaForm [] NoUpdate [Var "x"] (AppF (Var "x") [])
>>> [stg| x |]
AppF (Var "x") []

Specific syntax element quasiquoters

program :: QuasiQuoter Source #

Quasiquoter for Programs.

>>> [program| id = \x -> x |]
Program (Binds [(Var "id",LambdaForm [] NoUpdate [Var "x"] (AppF (Var "x") []))])

binds :: QuasiQuoter Source #

Quasiquoter for Binds.

>>> [binds| id = \x -> x |]
(Binds [(Var "id",LambdaForm [] NoUpdate [Var "x"] (AppF (Var "x") []))])

lambdaForm :: QuasiQuoter Source #

Quasiquoter for LambdaForms.

>>> [lambdaForm| \x -> x |]
LambdaForm [] NoUpdate [Var "x"] (AppF (Var "x") [])

expr :: QuasiQuoter Source #

Quasiquoter for Expressions.

>>> [expr| f x y z |]
AppF (Var "f") [AtomVar (Var "x"),AtomVar (Var "y"),AtomVar (Var "z")]

alts :: QuasiQuoter Source #

Quasiquoter for Alts.

>>> [alts| Just x -> True; default -> False |]
Alts (AlgebraicAlts (AlgebraicAlt (Constr "Just") [Var "x"] (AppC (Constr "True") []) :| [])) (DefaultNotBound (AppC (Constr "False") []))
>>> [alts| 0# -> True; default -> False |]
Alts (PrimitiveAlts (PrimitiveAlt (Literal 0) (AppC (Constr "True") []) :| [])) (DefaultNotBound (AppC (Constr "False") []))

nonDefaultAlts :: QuasiQuoter Source #

Quasiquoter for Alt.

>>> [nonDefaultAlts| Just x -> True; Nothing -> False; |]
AlgebraicAlts (AlgebraicAlt (Constr "Just") [Var "x"] (AppC (Constr "True") []) :| [AlgebraicAlt (Constr "Nothing") [] (AppC (Constr "False") [])])
>>> [nonDefaultAlts| 0# -> False; 1# -> True; |]
PrimitiveAlts (PrimitiveAlt (Literal 0) (AppC (Constr "False") []) :| [PrimitiveAlt (Literal 1) (AppC (Constr "True") [])])

algebraicAlt :: QuasiQuoter Source #

Quasiquoter for AlgebraicAlts.

>>> [algebraicAlt| Just x -> x; |]
AlgebraicAlt (Constr "Just") [Var "x"] (AppF (Var "x") [])

primitiveAlt :: QuasiQuoter Source #

Quasiquoter for PrimitiveAlts.

>>> [primitiveAlt| 1# -> x; |]
PrimitiveAlt (Literal 1) (AppF (Var "x") [])

defaultAlt :: QuasiQuoter Source #

Quasiquoter for DefaultAlts.

>>> [defaultAlt| default -> x |]
DefaultNotBound (AppF (Var "x") [])
>>> [defaultAlt| x -> x |]
DefaultBound (Var "x") (AppF (Var "x") [])

literal :: QuasiQuoter Source #

Quasiquoter for Literals.

>>> [literal| 1# |]
Literal 1

primOp :: QuasiQuoter Source #

Quasiquoter for PrimOps.

>>> [primOp| +# |]
Add

atom :: QuasiQuoter Source #

Quasiquoter for Atoms.

>>> [atom| x |]
AtomVar (Var "x")