Plan 9 from Bell Labs’s /usr/web/sources/contrib/fernan/nhc98/src/compiler98/Nice.hs

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


{- ---------------------------------------------------------------------------
Converts internal types (NewType) into a nice printable string
-}
module Nice (fixTid, mkAL, mkALNT
        , niceCtxs, niceField, niceInt, niceNT
        , niceNewType, niceTid, showsOp, showsVar
        )  where

import NT
import IntState
import Util.Extra(mixComma,mixSpace,assocDef)
import SysDeps(PackedString)
import TokenId
import Id(Id)
import Maybe

niceNT :: Maybe PackedString  -- module qualifier
        -> IntState           -- symboltable needed for names of ids
        -> [(Id,String)]      -- renaming mapping for type variables
        -> NT                 -- the type to be converted
        -> String

niceNT _ state al (NTany  a) = assocDef al ('?':show a ++ "?") a
niceNT _ state al (NTvar  a _) = assocDef al ('?':show a ++ "?") a
niceNT _ state al (NTexist a _) = assocDef al ('?':show a ++ "?") a
niceNT m state al (NTstrict t) = "!" ++ niceNT m state al t
niceNT m state al (NTapp t1 t2) = 
   '(':  niceNT m state al t1 ++ ' ': niceNT m state al t2 ++ ")"
niceNT m state al (NTcons a _ []) = niceInt m state a ""
niceNT m state al (NTcons a _ tas) =
        case (tidI . fromJust .  lookupIS state) a of
          TupleId n | n > length tas -> '(':'(':replicate (n-1) ',' ++") "
                                        ++mixSpace (map (niceNT m state al) tas)
                                        ++ ")"
          TupleId _ -> '(' : mixComma (map (niceNT m state al) tas) ++ ")"
          v | v == t_Arrow ->
                case tas of
                 [] -> "(->)"
                 [t1] -> "( (->) " ++ niceNT m state al t1 ++ ")"
                 [t1,t2] -> '(':niceNT m state al t1 ++ " -> " ++ niceNT m state al t2++")"
          v | v == t_List  -> "[" ++ (case tas of [] -> ""; [t] -> niceNT m state al t) ++ "]"
          v -> '(': show (fixTid (mrpsIS state) v) ++ ' ': mixSpace (map (niceNT m state al) tas) ++ ")"
niceNT m state al (NTcontext c a) =
        case (tidI . fromJust .  lookupIS state) c of
          TupleId _ -> '(' : niceNT m state al (mkNTvar a) ++ ")"
          v -> '(': show (fixTid (mrpsIS state) v) ++ ' ': niceNT m state al (mkNTvar a) ++ ")"


niceCtxs :: Eq a 
         => Maybe PackedString 
         -> IntState 
         -> [(a,String)] 
         -> [(Id,a)] 
         -> String

niceCtxs mmrps state al [] = ""
niceCtxs mmrps state al ctxs = "(" ++ mixComma (map ( \ (c,v) -> niceInt mmrps state c  (' ':assocDef al (error "niceCtx") v)) ctxs) ++ ") => "


niceInt :: Maybe PackedString -> IntState -> Id -> ShowS

niceInt Nothing state i     = (niceInfo (mrpsIS state) . fromJust . lookupIS state) i
niceInt (Just mrps) state i = (niceInfo  mrps          . fromJust . lookupIS state) i


niceTid :: IntState -> TokenId -> ShowS

niceTid state tid = (showsVar . fixTid (mrpsIS state)) tid


niceInfo :: PackedString -> Info -> ShowS

niceInfo mrps info = (showsVar . fixTid mrps . tidI) info


{- removes module name from qualified token if it is the current module name -}
fixTid :: PackedString -- name of current module
       -> TokenId 
       -> TokenId

fixTid mrps (Qualified tid n) | tid == mrps = Visible n
fixTid mrps v = v


{- produces renaming mapping for the free variables of given type -}
mkALNT :: NT -> [(Id,String)]

mkALNT = mkAL . freeNT


{- produces renaming mapping for given type ids -}
mkAL :: [a] -> [(a,String)]

mkAL tvs = 
   let tvars = map (:[]) ['a'..'z'] ++ map (++"'") tvars
   in zip tvs tvars


niceNewType :: IntState -> NewType -> String

niceNewType state (NewType free exist ctx nts) =
    let
      al = mkAL free ++ zip (map snd ctx) (map (('_':).(:[])) ['a'..'z']) -- a-z is too short!
    in niceCtxs Nothing state al ctx ++ mixSpace (map (niceNT Nothing state al) nts)


showsOp :: TokenId -> ShowS

showsOp tid =
        if isTidOp tid 
        then shows tid
        else showChar '`' . shows tid . showChar '`'


showsVar :: TokenId -> ShowS

showsVar tid =
        if isTidOp tid 
        then showChar '(' . shows tid . showChar ')'
        else shows tid


niceField :: IntState 
          -> [(Id,String)]  -- renaming mapping for type variables
          -> (Maybe Id,NT)  -- (possible field id, its type)
          -> String

niceField state al (Just i,nt) = (showChar '{' . shows (fixTid (mrpsIS state) (tidIS state i)) . showString " :: ")
                                 (niceNT Nothing state al nt ++ "}")
niceField state al (Nothing,nt) =
   niceNT Nothing state al nt

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@9p.io.