idris-1.0: Functional Programming Language with Dependent Types

CopyrightLicense : BSD3
MaintainerThe Idris Community.
Safe HaskellNone
LanguageHaskell98

IRTS.Defunctionalise

Description

To defunctionalise:

  1. Create a data constructor for each function
  2. Create a data constructor for each underapplication of a function
  3. Convert underapplications to their corresponding constructors
  4. Create an EVAL function which calls the appropriate function for data constructors created as part of step 1
  5. Create an APPLY function which adds an argument to each underapplication (or calls APPLY again for an exact application)
  6. Wrap overapplications in chains of APPLY
  7. Wrap unknown applications (i.e. applications of local variables) in chains of APPLY
  8. Add explicit EVAL to case, primitives, and foreign calls

Synopsis

Documentation

data DAlt Source #

Instances

Eq DAlt Source # 

Methods

(==) :: DAlt -> DAlt -> Bool #

(/=) :: DAlt -> DAlt -> Bool #

Show DAlt Source # 

Methods

showsPrec :: Int -> DAlt -> ShowS #

show :: DAlt -> String #

showList :: [DAlt] -> ShowS #

data DDecl Source #

Instances

Eq DDecl Source # 

Methods

(==) :: DDecl -> DDecl -> Bool #

(/=) :: DDecl -> DDecl -> Bool #

Show DDecl Source # 

Methods

showsPrec :: Int -> DDecl -> ShowS #

show :: DDecl -> String #

showList :: [DDecl] -> ShowS #

getFn :: [(Name, LDecl)] -> [(Name, Int)] Source #

addApps :: LDefs -> (Name, LDecl) -> State ([Name], [(Name, Int)]) (Name, DDecl) Source #

data EvalApply a Source #

Constructors

EvalCase (Name -> a) 
ApplyCase a 
Apply2Case a 

toConsA :: [(Name, Int)] -> (Name, Int) -> [(Name, Int, EvalApply DAlt)] Source #

mkFnCon :: Show a => a -> Name Source #

mkBigCase :: t -> Int -> DExp -> [DAlt] -> DExp Source #

Divide up a large case expression so that each has a maximum of max branches

groupsOf :: Int -> [DAlt] -> [[DAlt]] Source #

module IRTS.Lang