idris-1.3.4: Functional Programming Language with Dependent Types
LicenseBSD3
MaintainerThe Idris Community.
Safe HaskellNone
LanguageHaskell2010

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

declare :: Int -> [(Name, Int, EvalApply DAlt)] -> [(Name, DDecl)] #

data DExp #

Instances

Instances details
ToJSON DExp # 
Instance details

Defined in IRTS.Portable

Show DExp # 
Instance details

Defined in IRTS.Defunctionalise

Methods

showsPrec :: Int -> DExp -> ShowS #

show :: DExp -> String #

showList :: [DExp] -> ShowS #

Eq DExp # 
Instance details

Defined in IRTS.Defunctionalise

Methods

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

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

data DAlt #

Instances

Instances details
ToJSON DAlt # 
Instance details

Defined in IRTS.Portable

Show DAlt # 
Instance details

Defined in IRTS.Defunctionalise

Methods

showsPrec :: Int -> DAlt -> ShowS #

show :: DAlt -> String #

showList :: [DAlt] -> ShowS #

Eq DAlt # 
Instance details

Defined in IRTS.Defunctionalise

Methods

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

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

data DDecl #

Instances

Instances details
ToJSON DDecl # 
Instance details

Defined in IRTS.Portable

Show DDecl # 
Instance details

Defined in IRTS.Defunctionalise

Methods

showsPrec :: Int -> DDecl -> ShowS #

show :: DDecl -> String #

showList :: [DDecl] -> ShowS #

Eq DDecl # 
Instance details

Defined in IRTS.Defunctionalise

Methods

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

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

type DDefs = Ctxt DDecl #

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

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

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

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

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

data EvalApply a #

Constructors

EvalCase (Name -> a) 
ApplyCase a 
Apply2Case a 

genArgs :: Int -> [Name] #

mkBigCase :: p -> Int -> DExp -> [DAlt] -> DExp #

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

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

module IRTS.Lang