Changeset 5168

Show
Ignore:
Timestamp:
07/04/05 00:35:11 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
6965
Message:

* qualified names now dealt with consistently; new and

improved API moved to Pugs.Eval.Var:

isQualified, packageOf, qualify, toPackage, toQualified,

Location:
src/Pugs
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Compile.hs

    r5115 r5168  
    1616import Pugs.Types 
    1717import Pugs.Eval 
     18import Pugs.Eval.Var 
    1819import Emit.PIR 
    1920import Text.PrettyPrint 
     
    428429varText x           = error $ "invalid name: " ++ x 
    429430 
    430 packageOf :: String -> String 
    431 packageOf name = case isQualified name of 
    432     Just (pkg, _)   -> pkg 
    433     _               -> "main" 
    434  
    435 qualify :: String -> String 
    436 qualify name = case isQualified name of 
    437     Just _  -> name 
    438     _       -> let (sigil, name') = span (not . isAlphaNum) name 
    439         in sigil ++ "main::" ++ name' 
    440  
    441 isQualified :: String -> Maybe (String, String) 
    442 isQualified name | Just (post, pre) <- breakOnGlue "::" (reverse name) = 
    443     let (sigil, pkg) = span (not . isAlphaNum) preName 
    444         name'       = possiblyFixOperatorName (sigil ++ postName) 
    445         preName     = reverse pre 
    446         postName    = reverse post 
    447     in Just (pkg, name') 
    448 isQualified _ = Nothing 
    449  
    450431initTEnv :: Eval TEnv 
    451432initTEnv = do 
  • src/Pugs/Eval/Var.hs

    r5023 r5168  
    55    findVar, findVarRef, 
    66    evalVar, findSub, evalExpType, 
     7    isQualified, packageOf, qualify, 
     8    toPackage, toQualified, 
    79) where 
    810import qualified Data.Map as Map 
     
    7173    doFindVarRef name = do 
    7274        callCC $ \foundIt -> do 
    73             lexSym <- fmap (findSym name . envLexical) ask 
     75            lexSym  <- fmap (findSym name . envLexical) ask 
    7476            when (isJust lexSym) $ foundIt lexSym 
    75             glob   <- liftSTM . readTVar . envGlobal =<< ask 
    76             let globSym = findSym name glob 
     77            glob    <- liftSTM . readTVar . envGlobal =<< ask 
     78            name'   <- toQualified name 
     79            -- XXX - find qualified name here 
     80            let globSym = findSym name' glob 
    7781            when (isJust globSym) $ foundIt globSym 
    7882            let globSym = findSym (toGlobal name) glob 
     
    398402    = Nothing 
    399403 
     404breakSigil :: String -> (String, String) 
     405breakSigil = break (\x -> isAlpha x || x == '_') 
     406 
    400407toPackage :: String -> String -> String 
    401408toPackage pkg name 
    402     | (sigil, identifier) <- break (\x -> isAlpha x || x == '_') name 
     409    | (sigil, identifier) <- breakSigil name 
    403410    , last sigil /= '*' 
    404411    = concat [sigil, pkg, "::", identifier] 
    405412    | otherwise = name 
    406413 
     414packageOf :: String -> String 
     415packageOf name = case isQualified name of 
     416    Just (pkg, _)   -> pkg 
     417    _               -> "main" 
     418 
     419qualify :: String -> String 
     420qualify name = case isQualified name of 
     421    Just _  -> name 
     422    _       -> let (sigil, name') = breakSigil name 
     423        in sigil ++ "main::" ++ name' 
     424 
     425isQualified :: String -> Maybe (String, String) 
     426isQualified name | Just (post, pre) <- breakOnGlue "::" (reverse name) = 
     427    let (sigil, pkg) = span (not . isAlphaNum) preName 
     428        name'       = possiblyFixOperatorName (sigil ++ postName) 
     429        preName     = reverse pre 
     430        postName    = reverse post 
     431    in Just (pkg, name') 
     432isQualified _ = Nothing 
     433 
     434toQualified :: String -> Eval String 
     435toQualified name@(_:'*':_) = return name 
     436toQualified name@(_:'?':_) = return name 
     437toQualified name@(_:"!") = return name 
     438toQualified name@(_:"/") = return name 
     439toQualified name = do 
     440    case isQualified name of 
     441        Just _  -> return name 
     442        _       -> do 
     443            pkg <- asks envPackage 
     444            return $ toPackage pkg name