{-# LANGUAGE OverloadedStrings #-} -- | All hardcoded names in the compiler should go in here -- the convention is -- v_foo for values -- tc_foo for type constructors -- dc_foo for data constructors -- s_foo for sort names -- rt_foo for raw names -- class_foo for classes module Name.Names(module Name.Names,module Name.Prim) where import Data.Char(isDigit) import Name.Name import Name.Prim import Name.VConsts instance TypeNames Name where tInt = tc_Int tBool = tc_Bool tInteger = tc_Integer tChar = tc_Char tUnit = tc_Unit tIntzh = rt_bits32 tEnumzh = rt_bits16 tCharzh = tc_Char_ -- tWorld__ = tc_World__ --No tuple instance because it is easy to get the namespace wrong. use 'nameTuple' --instance ToTuple Name where -- toTuple n = toName DataConstructor (toTuple n :: (String,String)) nameTuple _ n | n < 2 = error "attempt to create tuple of length < 2" nameTuple t n = toName t $ (toTuple n:: (String,String)) -- Qual (HsIdent ("(" ++ replicate (n - 1) ',' ++ ")")) unboxedNameTuple t n = toName t $ "(#" ++ show n ++ "#)" fromUnboxedNameTuple n = case show n of '(':'#':xs | (ns@(_:_),"#)") <- span isDigit xs -> return (read ns::Int) _ -> fail $ "Not unboxed tuple: " ++ show n instance FromTupname Name where fromTupname name | m == Module "Jhc.Prim.Prim" = fromTupname (nn::String) where (_,(m,nn)) = fromName name fromTupname _ = fail "not a tuple" -- quasi-kinds (placeholders for existential kinds) s_Quest = toName SortName (Module "Jhc@","?"::String) s_QuestQuest = toName SortName (Module "Jhc@","??"::String) s_StarBang = toName SortName (Module "Jhc@","*!"::String) s_Any = toName SortName (Module "Jhc@","ANY"::String) u_instance = toName UnknownType (Module "Jhc@","instance"::String) sFuncNames = FuncNames { func_equals = v_equals, func_fromInteger = v_fromInteger, func_fromInt = v_fromInt, func_fromRational = v_fromRational, func_negate = v_negate, func_runExpr = v_runExpr, func_runMain = v_runMain, func_runNoWrapper = v_runNoWrapper, func_runRaw = v_runRaw }