ddc-core-0.4.2.1: DDC/Core/Fragment/Feature.hs
module DDC.Core.Fragment.Feature
(Feature(..))
where
-- | Language feature supported by a fragment.
data Feature
-- Type system features ---------------------------
-- | Track effect type information.
= TrackedEffects
-- | Track closure type information.
| TrackedClosures
-- | Attach latent effects to function types.
| FunctionalEffects
-- | Attach latent closures to function types.
| FunctionalClosures
-- | Treat effects as capabilities.
| EffectCapabilities
-- | Insert implicit run casts for effectful applications.
| ImplicitRun
-- | Insert implicit box casts for bodies of abstractions.
| ImplicitBox
-- General features -------------------------------
-- | Partially applied primitive operators.
| PartialPrims
-- | Partially applied functions
| PartialApplication
-- | Function application where the thing being applied
-- is not a variable.
-- Most backend languages (like LLVM) don't support this.
| GeneralApplication
-- | Nested function bindings.
-- The output of the lambda-lifter should not contain these.
| NestedFunctions
-- | Recursive let-expressions where the right hand sides
-- are not lambda abstractions.
| GeneralLetRec
-- | Debruijn binders.
-- Most backends will want to use real names, instead of indexed
-- binders.
| DebruijnBinders
-- | Allow data and witness vars without binding occurrences if
-- they are annotated directly with their types. This lets
-- us work with open terms.
| UnboundLevel0Vars
-- | Allow non-primitive functions to be instantiated at unboxed types.
-- Our existing backends can't handle this, because boxed and unboxed
-- objects have different representations.
| UnboxedInstantiation
-- Sanity -----------------------------------------
-- | Allow name shadowing.
| NameShadowing
-- | Allow unused named data and witness bindings.
| UnusedBindings
-- | Allow unused named matches.
| UnusedMatches
deriving (Eq, Ord, Show)