|
|
|
|
|
Description |
Handy functions for creating much Core syntax
|
|
Synopsis |
|
|
|
|
Constructing normal syntax
|
|
|
Bind a binding group over an expression, using a let or case as
appropriate (see CoreSyn)
|
|
|
Bind a list of binding groups over an expression. The leftmost binding
group becomes the outermost group in the resulting expression
|
|
|
Construct an expression which represents the application of one expression
to the other
|
|
|
Construct an expression which represents the application of a number of
expressions to another. The leftmost expression in the list is applied first
|
|
|
Construct an expression which represents the application of a number of
expressions to that of a data constructor expression. The leftmost expression
in the list is applied first
|
|
|
Create a lambda where the given expression has a number of variables
bound over it. The leftmost binder is that bound by the outermost
lambda in the result
|
|
|
|
|
Make a wildcard binder. This is typically used when you need a binder
that you expect to use only at a *binding* site. Do not use it at
occurrence sites because it has a single, fixed unique, and it's very
easy to get into difficulties with shadowing. That's why it is used so little.
|
|
|
|
Constructing boxed literals
|
|
|
Create a CoreExpr which will evaluate to the a Word with the given value
|
|
|
Create a CoreExpr which will evaluate to the given Word
|
|
|
Create a CoreExpr which will evaluate to the given Int
|
|
|
Create a CoreExpr which will evaluate to the given Int
|
|
|
Create a CoreExpr which will evaluate to the given Integer
|
|
|
Create a CoreExpr which will evaluate to the given Float
|
|
|
Create a CoreExpr which will evaluate to the given Double
|
|
|
Create a CoreExpr which will evaluate to the given Char
|
|
|
Create a CoreExpr which will evaluate to the given String
|
|
|
Create a CoreExpr which will evaluate to a string morally equivalent to the given FastString
|
|
Constructing general big tuples
|
|
GHCs built in tuples can only go up to mAX_TUPLE_SIZE in arity, but
we might concievably want to build such a massive tuple as part of the
output of a desugaring stage (notably that for list comprehensions).
We call tuples above this size "big tuples", and emulate them by
creating and pattern matching on >nested< tuples that are expressible
by GHC.
Nesting policy: it's better to have a 2-tuple of 10-tuples (3 objects)
than a 10-tuple of 2-tuples (11 objects), so we want the leaves of any
construction to be big.
If you just use the mkBigCoreTup, mkBigCoreVarTupTy, mkTupleSelector
and mkTupleCase functions to do all your work with tuples you should be
fine, and not have to worry about the arity limitation at all.
|
|
|
:: [a] -> a | "Small" constructor function, of maximum input arity mAX_TUPLE_SIZE
| -> [a] | Possible "big" list of things to construct from
| -> a | Constructed thing made possible by recursive decomposition
| Lifts a "small" constructor into a "big" constructor by recursive decompositon
|
|
|
Constructing small tuples
|
|
|
Build a small tuple holding the specified variables
|
|
|
Bulid the type of a small tuple that holds the specified variables
|
|
|
Build a small tuple holding the specified expressions
|
|
|
Build the type of a small tuple that holds the specified type of thing
|
|
Constructing big tuples
|
|
|
Build a big tuple holding the specified variables
|
|
|
Build the type of a big tuple that holds the specified variables
|
|
|
Build a big tuple holding the specified expressions
|
|
|
Build the type of a big tuple that holds the specified type of thing
|
|
Deconstructing small tuples
|
|
|
Like mkTupleSelector but for tuples that are guaranteed
never to be "big".
mkSmallTupleSelector [x] x v e = [| e |]
mkSmallTupleSelector [x,y,z] x v e = [| case e of v { (x,y,z) -> x } |]
|
|
|
:: [Id] | The tuple args
| -> CoreExpr | Body of the case
| -> Id | A variable of the same type as the scrutinee
| -> CoreExpr | Scrutinee
| -> CoreExpr | | As mkTupleCase, but for a tuple that is small enough to be guaranteed
not to need nesting.
|
|
|
Deconstructing big tuples
|
|
|
:: [Id] | The Ids to pattern match the tuple against
| -> Id | The Id to select
| -> Id | A variable of the same type as the scrutinee
| -> CoreExpr | Scrutinee
| -> CoreExpr | Selector expression
| Builds a selector which scrutises the given
expression and extracts the one name from the list given.
If you want the no-shadowing rule to apply, the caller
is responsible for making sure that none of these names
are in scope.
If there is just one Id in the tuple, then the selector is
just the identity.
If necessary, we pattern match on a "big" tuple.
|
|
|
|
:: UniqSupply | For inventing names of intermediate variables
| -> [Id] | The tuple identifiers to pattern match on
| -> CoreExpr | Body of the case
| -> Id | A variable of the same type as the scrutinee
| -> CoreExpr | Scrutinee
| -> CoreExpr | | A generalization of mkTupleSelector, allowing the body
of the case to be an arbitrary expression.
To avoid shadowing, we use uniques to invent new variables.
If necessary we pattern match on a "big" tuple.
|
|
|
Constructing list expressions
|
|
|
Makes a list [] for lists of the specified type
|
|
|
Makes a list (:) for lists of the specified type
|
|
|
Make a list containing the given expressions, where the list has the given type
|
|
|
|
|
|
:: (MonadThings m, MonadUnique m) | | => Type | Type of list elements to be built
| -> (Id, Type) -> (Id, Type) -> m CoreExpr | Function that, given information about the Ids
of the binders for the build worker function, returns
the body of that worker
| -> m CoreExpr | | Make a build expression applied to a locally-bound worker function
|
|
|
Produced by Haddock version 2.6.1 |