{-# LINE 2 "src/ehc/Base/API.chs" #-} -- | Base Public API (provisional, to be refactored) -- module UHC.Light.Compiler.Base.API ( -- * Opts -- | Options to the compiler. EHCOpts(..) , defaultEHCOpts -- * Names -- | Names in UHC have to be of the form P1.P2....Pn.Ident . All names -- in module M must have the form M.Ident . Datatype and constructor names -- have to start with an uppercase letter, functions with a lowercase letter. , mkUniqueHsName , addHsNamePrefix , mkHsName , mkHsName1 -- * Constructor Tags -- From Base.Common , CTag -- * Names , HsName , HSNM(mkHNm) -- * Possible targets, optimization, ... , Target(..) , OptimizationScope(..) -- * Error , Err -- * Utility datatypes , MaybeOk(..) , Verbosity(..) -- * Misc , hsnEhcRunMain , hsnMain ) where import UHC.Light.Compiler.Base.Common import UHC.Light.Compiler.Base.HsName import UHC.Light.Compiler.Base.HsName.Builtin import UHC.Light.Compiler.Base.Target import UHC.Light.Compiler.Base.Optimize import UHC.Light.Compiler.Opts import UHC.Light.Compiler.Error import qualified Data.Map as M -- ************************************** -- Names -- ************************************** -- | Creates a new Core name. All names generated with this function live in -- the "Core API" namespace and will not collide with names in other namespaces. -- Names in the "Core API" namespace cannot be called from Haskell code. -- -- Use this function to create names used only inside Core code generated by your own Compiler, -- e.g. module-scoped or local functions. mkUniqueHsName :: String -- ^ Name prefix. Used to distinguish names generated by different API consumers, -- but may also be used to differentiate between different varieties by one API consumer. -- Use reverse-dns notation if possible, e.g. "nl.uu.agda.identOfVarietyA" -> [String] -- ^ The module prefix. -> String -- ^ The name to make unique. -> HsName -- UHC expects names to be of the _Modf variety. If _Base/hsnFromString is used -- instead things start to break, e.g. calling functions defined in other packages. mkUniqueHsName prefix = hsnMkModf1 (M.singleton HsNameUniqifier_CoreAPI [HsNameUnique_String prefix]) -- | Creates a new Core name. The generated name lives in the default namespace, -- hence may clash with Haskell-defined names. mkHsName :: [String] -- ^ The module prefix. -> String -- ^ The local name of the identifier. -> HsName mkHsName = hsnMkModf1 M.empty -- | Creates a new Core name. The generated name lives in the default namespace, -- hence may clash with Haskell-defined names. mkHsName1 :: String -> HsName mkHsName1 nm = mkHsName (init xs) (last xs) -- TODO there is probably something like that somewhere in UHC? where xs = splitBy '.' nm splitBy :: Eq a => a -> [a] -> [[a]] splitBy sep = (foldr (\x (a1:as) -> if x == sep then ([]:a1:as) else ((x:a1):as)) [[]]) -- | Adds an additional prefix to a 'HsName'. This can be used to derive a new -- unique name from an existing name. addHsNamePrefix :: String -> HsName -> HsName addHsNamePrefix prefix name = hsnUniqifyStr HsNameUniqifier_CoreAPI prefix name -- | Local helper function. Converts string names to HsNames. hsnMkModf1 :: HsNameUniqifierMp -> [String] -> String -> HsName -- UHC expects names to be of the _Modf variety. If _Base/hsnFromString is used -- instead things start to break, e.g. calling functions defined in other packages. hsnMkModf1 uniq mods nm = hsnMkModf mods (hsnFromString nm) uniq