Copyright | (c) 1999 - 2003 Wolfgang Lux Martin Engelke |
---|---|
License | BSD-3-clause |
Maintainer | bjp@informatik.uni-kiel.de |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
IL.Type
Contents
Description
The module IL
defines the intermediate language which will be
compiled into abstract machine code. The intermediate language removes
a lot of syntactic sugar from the Curry source language. Top-level
declarations are restricted to data type and function definitions. A
newtype definition serves mainly as a hint to the backend that it must
provide an auxiliary function for partial applications of the
constructor (Newtype constructors must not occur in patterns
and may be used in expressions only as partial applications.).
Type declarations use a de-Bruijn indexing scheme (starting at 0) for type variables. In the type of a function, all type variables are numbered in the order of their occurence from left to right, i.e., a type '(Int -> b) -> (a,b) -> c -> (a,c)' is translated into the type (using integer numbers to denote the type variables) '(Int -> 0) -> (1,0) -> 2 -> (1,2)'.
Pattern matching in an equation is handled via flexible and rigid
Case
expressions. Overlapping rules are translated with the
help of Or
expressions. The intermediate language has three
kinds of binding expressions, Exist
expressions introduce a
new logical variable, Let
expression support a single
non-recursive variable binding, and Letrec
expressions
introduce multiple variables with recursive initializer expressions.
The intermediate language explicitly distinguishes (local) variables
and (global) functions in expressions.
Note: this modified version uses haskell type Integer
instead of Int
for representing integer values. This provides
an unlimited range of integer constants in Curry programs.
- data Module = Module ModuleIdent [ModuleIdent] [Decl]
- data Decl
- data ConstrDecl a = ConstrDecl QualIdent a
- data CallConv
- data Type
- data Literal
- data ConstrTerm
- data Expression
- data Eval
- data Alt = Alt ConstrTerm Expression
- data Binding = Binding Ident Expression
Data types
Constructors
Module ModuleIdent [ModuleIdent] [Decl] |
Constructors
DataDecl QualIdent Int [ConstrDecl [Type]] | |
NewtypeDecl QualIdent Int (ConstrDecl Type) | |
FunctionDecl QualIdent [Ident] Type Expression | |
ExternalDecl QualIdent CallConv String Type |
data ConstrDecl a Source #
Constructors
ConstrDecl QualIdent a |
Instances
Eq a => Eq (ConstrDecl a) Source # | |
Data a => Data (ConstrDecl a) Source # | |
Show a => Show (ConstrDecl a) Source # | |
Constructors
TypeConstructor QualIdent [Type] | |
TypeVariable Int | |
TypeArrow Type Type |
data ConstrTerm Source #
Constructors
LiteralPattern Literal | literal patterns |
ConstructorPattern QualIdent [Ident] | constructors |
VariablePattern Ident | default |
Instances
data Expression Source #
Constructors
Literal Literal | literal constants |
Variable Ident | variables |
Function QualIdent Int | functions |
Constructor QualIdent Int | constructors |
Apply Expression Expression | applications |
Case SrcRef Eval Expression [Alt] | case expressions |
Or Expression Expression | non-deterministic or |
Exist Ident Expression | exist binding (introduction of a free variable) |
Let Binding Expression | let binding |
Letrec [Binding] Expression | letrec binding |
Typed Expression Type | typed expression |
Instances
Constructors
Alt ConstrTerm Expression |