[project @ 1996-01-08 20:28:12 by partain]
[ghc-hetmet.git] / ghc / compiler / coreSyn / PlainCore.lhs
diff --git a/ghc/compiler/coreSyn/PlainCore.lhs b/ghc/compiler/coreSyn/PlainCore.lhs
new file mode 100644 (file)
index 0000000..4aaf948
--- /dev/null
@@ -0,0 +1,185 @@
+%
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
+%
+\section[PlainCore]{``Plain'' core syntax: the usual parameterisation}
+
+This module defines a particular parameterisation of the @CoreSyntax@
+data type.  Both binders and bindees are just @Ids@.  This is the
+normal thing.
+
+\begin{code}
+#include "HsVersions.h"
+
+module PlainCore (
+       PlainCoreProgram(..), PlainCoreBinding(..), PlainCoreExpr(..),
+       PlainCoreAtom(..), PlainCoreCaseAlternatives(..),
+       PlainCoreCaseDefault(..), PlainCoreArg(..),
+#ifdef DPH
+       PlainCoreParQuals(..),
+       PlainCoreParCommunicate(..),
+       CoreParCommunicate(..),
+       CoreParQuals(..),
+       isParCoreCaseAlternative,
+       mkNonRecBinds, 
+#endif
+       pprPlainCoreBinding,
+       pprBigCoreBinder, pprTypedCoreBinder, -- not exported: pprBabyCoreBinder,
+
+       CoreBinding(..), CoreExpr(..), CoreAtom(..), -- re-exported
+       CoreCaseAlternatives(..), CoreCaseDefault(..),
+       pprCoreExpr,
+
+       CoreArg(..), applyToArgs, decomposeArgs, collectArgs,
+
+       -- and the related utility functions from CoreFuns...
+
+       typeOfCoreExpr,  typeOfCoreAlts,
+       instCoreExpr,   substCoreExpr,   -- UNUSED: cloneCoreExpr,
+       substCoreExprUS, -- UNUSED: instCoreExprUS, cloneCoreExprUS,
+       instCoreBindings,
+       mkCoLam, mkCoreIfThenElse,
+--     mkCoApp, mkCoCon, mkCoPrim, -- no need for export
+       mkCoApps,
+       mkCoLetAny, mkCoLetNoUnboxed, mkCoLetUnboxedToCase,
+       mkCoLetsAny, mkCoLetsNoUnboxed, mkCoLetsUnboxedToCase,
+       mkCoLetrecAny, mkCoLetrecNoUnboxed,
+       mkCoTyLam, mkCoTyApp, mkCoTyApps,
+       mkErrorCoApp, escErrorMsg,
+       pairsFromCoreBinds,
+       mkFunction, atomToExpr,
+       digForLambdas,
+       exprSmallEnoughToDup,
+       manifestlyWHNF, manifestlyBottom, --UNUSED: manifestWHNFArgs,
+       coreExprArity,
+       isWrapperFor,
+       maybeErrorApp,
+--UNUSED: boilsDownToConApp,
+       nonErrorRHSs, bindersOf,
+       squashableDictishCcExpr,
+
+       calcUnfoldingGuidance,
+       pprCoreUnfolding,
+       mentionedInUnfolding,
+
+       -- and one variant of free-var-finding stuff:
+       addTopBindsFVs, FVCoreExpr(..), FVCoreBinding(..),
+
+       -- and to make the interface self-sufficient ...
+       Outputable(..), NamedThing(..),
+       ExportFlag, SrcLoc, Unique,
+       Pretty(..), PprStyle, PrettyRep,
+
+       BasicLit, BinderInfo, Class, Id, Demand, IdInfo, FullName,
+       UnfoldingGuidance, UniType, TauType(..), ThetaType(..),
+       SigmaType(..), TyVar, TyCon, CostCentre, PrimOp, UniqueSupply,
+       UniqSM(..), IdEnv(..), UniqFM,
+       TyVarEnv(..), TypeEnv(..), IdSet(..), UniqSet(..),
+       Maybe, Bag
+       IF_ATTACK_PRAGMAS(COMMA cmpClass)
+       IF_ATTACK_PRAGMAS(COMMA cmpUniType)
+       IF_ATTACK_PRAGMAS(COMMA initUs) -- profiling
+
+-- NOTE(hilly) Added UniqSM for cloneFunctions
+
+    ) where
+
+--IMPORT_Trace -- ToDo: rm (debugging)
+
+import CoreSyn         -- mostly re-exporting this stuff
+import CoreFuns
+import CoreUnfold
+
+import AbsUniType      ( TauType(..), ThetaType(..), SigmaType(..),
+                         Class, UniType, FullName
+                         IF_ATTACK_PRAGMAS(COMMA cmpClass)
+                         IF_ATTACK_PRAGMAS(COMMA cmpUniType)
+                       )
+import FreeVars
+import Id              ( getIdUniType, getIdStrictness, getIdInfo,
+                         Id, TypeEnv(..)
+                       )
+import IdEnv           -- ( nullIdEnv, IdEnv )
+import IdInfo
+import Maybes          ( Maybe(..) )
+import Outputable
+import Pretty
+import Unique          ( UniqSM(..), Unique
+                         IF_ATTACK_PRAGMAS(COMMA initUs)
+                       )
+import Util
+
+infixr 9 `thenUf`, `thenUf_`
+\end{code}
+
+The ``Core things'' just described are parameterised with respect to
+the information kept about binding occurrences and bound occurrences
+of variables.
+
+The ``Plain Core things'' are instances of the ``Core things'' in
+which nothing but a name is kept, for both binders and variables.
+\begin{code}
+type PlainCoreProgram = [CoreBinding Id Id]
+type PlainCoreBinding = CoreBinding  Id Id
+type PlainCoreExpr    = CoreExpr     Id Id
+type PlainCoreAtom    = CoreAtom        Id
+#ifdef DPH
+type PlainCoreParQuals         = CoreParQuals Id Id
+type PlainCoreParCommunicate   = CoreParCommunicate Id Id
+#endif {- Data Parallel Haskell -}
+type PlainCoreCaseAlternatives = CoreCaseAlternatives Id Id
+type PlainCoreCaseDefault      = CoreCaseDefault Id Id
+
+type PlainCoreArg = CoreArg Id
+\end{code}
+
+%************************************************************************
+%*                                                                     *
+\subsection[printing-PlainCore]{Printing @PlainCore@ things}
+%*                                                                     *
+%************************************************************************
+
+The most common core-printing interface:
+\begin{code}
+pprPlainCoreBinding :: PprStyle -> PlainCoreBinding -> Pretty
+
+pprPlainCoreBinding sty (CoNonRec binder expr)
+  = ppHang (ppCat [pprBigCoreBinder sty binder, ppEquals])
+        4 (pprCoreExpr sty pprBigCoreBinder pprBabyCoreBinder ppr expr)
+
+pprPlainCoreBinding sty (CoRec binds)
+  = ppAboves [ifPprDebug sty (ppStr "{- plain CoRec -}"),
+             ppAboves (map ppr_bind binds),
+             ifPprDebug sty (ppStr "{- end plain CoRec -}")]
+  where
+    ppr_bind (binder, expr)
+      = ppHang (ppCat [pprBigCoreBinder sty binder, ppEquals])
+            4 (pprCoreExpr sty pprBigCoreBinder pprBabyCoreBinder ppr expr)
+\end{code}
+
+Other printing bits-and-bobs used with the general @pprCoreBinding@
+and @pprCoreExpr@ functions.
+\begin{code}
+pprBigCoreBinder sty binder
+  = ppAboves [sig, pragmas, ppr sty binder]
+  where
+    sig = ifnotPprShowAll sty (
+           ppHang (ppCat [ppr sty binder, ppStr "::"])
+                4 (ppr sty (getIdUniType binder)))
+
+    pragmas = ifnotPprForUser sty (
+           ppIdInfo sty binder True{-specs, please-} id nullIdEnv (getIdInfo binder))
+
+pprBabyCoreBinder sty binder
+  = ppCat [ppr sty binder, pp_strictness]
+  where
+    pp_strictness
+      = case (getIdStrictness binder) of
+         NoStrictnessInfo    -> ppNil
+         BottomGuaranteed    -> ppStr "{- _!_ -}"
+         StrictnessInfo xx _ -> ppStr ("{- " ++ (showList xx "") ++ " -}")
+
+pprTypedCoreBinder sty binder
+  = ppBesides [ppLparen, ppCat [ppr sty binder,
+       ppStr "::", ppr sty (getIdUniType binder)],
+       ppRparen]
+\end{code}