KiCS-0.8.4: src/Names.hs
module Names where
import Char
import List
import System.FilePath
import ShowFunctionalProg (isTuple,isInfixOpName)
---------------------------------------------------------------------------
-- generating names to avoid clashes with Haskell
---------------------------------------------------------------------------
-- constructor names
preludeConstructorName "()" = "T0"
preludeConstructorName "[]" = "List"
preludeConstructorName ":" = ":<"
preludeConstructorName n
| isTuple n = "T"++show (1+length (takeWhile (==',') (tail n)))
| otherwise = 'C':'_':n
constructorName = preludeConstructorName
consName extFuncs (m,n) =
case m of
"Prelude" -> (dataDefMod extFuncs m,preludeConstructorName n)
"" -> ("",preludeConstructorName n)
_ -> (dataDefMod extFuncs m,constructorName n)
{-
extConsName exts (m,n) = case m of
"Prelude" -> (datamod m,preludeConstructorName n)
"" -> ("",preludeConstructorName n)
_ -> (datamod m,constructorName n)
where
datamod = if elem (m,n) exts then extDataModName else dataModName
-}
dataDefMod :: Bool -> String -> String
dataDefMod False = modName
dataDefMod True = instModName
-- function names
preludeFunctionName s@"share" = s
preludeFunctionName n = functionName n
functionName n | isInfixOpName n = elimInfix n
| otherwise = 'c':'_':n
funName (p@"Prelude",n) = (modName p,preludeFunctionName n)
funName (m,n) = (modName m,functionName n)
elimInfix name = "op_"++concat (intersperse "_" (map (show . ord) name))
-----------------------------------------
-- naming conventions for new objects
-----------------------------------------
-- module names
insertName :: String -> FilePath -> FilePath
insertName s xs = replaceFileName xs (s++takeFileName xs)
modName s = insertName "Curry" s
dataMName = "Data"
instMName = "Instances"
funcMName = "Functions"
dbgMName = "Oracle"
external = insertName "External"
extDataMName = external dataMName
extInstMName = external instMName
extFuncMName = external funcMName
dataModName = insertName dataMName
instModName = insertName instMName
funcModName = insertName funcMName
dbgModName = insertName dbgMName
extDataModName = insertName extDataMName
extInstModName = insertName extInstMName
extFuncModName = insertName extFuncMName
dataHsName s = replaceExtension (dataModName s) ".hs"
instHsName s = replaceExtension (instModName s) ".hs"
funcHsName s = replaceExtension (modName s) ".hs"
extDataHsName s = replaceExtension (extDataModName s) ".hs"
extInstHsName s = replaceExtension (extInstModName s) ".hs"
extFuncHsName s = replaceExtension (extFuncModName s) ".hs"
externalSpecName s = replaceExtension (external s) ".spec"
strictPrefix = "S"
mkStrictName = insertName strictPrefix
-- names for new constructors
--addPrefix s _ (p@"Prelude","Int") = (instModName p,"C_Int"++s)
--addPrefix s _ (p@"Prelude","Float") = (instModName p,"Prim"++s)
addPrefix s (m,n) = (m,n++s)
freeVarName = addPrefix "FreeVar"
failName = addPrefix "Fail"
orName = addPrefix "Or"
suspName = addPrefix "Susp"