Changeset 13792 for src/Pugs/Eval

Show
Ignore:
Timestamp:
10/02/06 16:56:49 (2 years ago)
Author:
audreyt
Message:

* Pugs.Eval.Var: Much improve multi dispatch system;

now the presence of a slurpy named hash (*%_, which is
default for all methods) no longer totally disables
argument-counting compatibility check.

Also, (Str @x) now constraints the incoming argument
to Array, not Str, as it should be.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Eval/Var.hs

    r13770 r13792  
    289289    findSub' var = do 
    290290        subSyms     <- findSyms var 
    291         lens        <- mapM argSlurpLen (unwrap $ maybeToList _invs ++ _args) 
     291        lens        <- mapM argSlurpLen _invs_args 
    292292        doFindSub (sum lens) subSyms 
    293293 
     
    297297        val <- enterLValue $ evalExp (Var name) 
    298298        valSlurpLen val 
    299     argSlurpLen (Syn "," list) =  return $ length list 
     299    argSlurpLen (Syn "," list) = return $ length list 
     300    argSlurpLen (Syn "named" _) = return 0 
    300301    argSlurpLen _ = return 1 -- XXX 
    301302 
     
    316317            _               -> Nothing 
    317318 
     319    _invs_args = map unwrap (maybe _args (:_args) _invs) 
     320 
    318321    -- subs :: (_invs :: Maybe Exp, _args :: [Exp]) 
    319322    --     => Int -> [(Var, Val)] -> Eval [((Bool, Bool, Int, Int), VCode)] 
    320323    subs slurpLen subSyms = fmap catMaybes . forM subSyms $ \(_, val) -> do 
    321324        sub@(MkCode{ subReturns = ret, subParams = prms }) <- fromVal val 
    322         let rv = return $ arityMatch sub (length (maybeToList _invs ++ _args)) slurpLen 
     325        let (named, positional) = partition isNamedArg _invs_args 
     326            isNamedArg (Syn "named" _) = True 
     327            isNamedArg _               = False 
     328            rv = return $ arityMatch sub (length positional) (length named) slurpLen 
    323329        maybeM rv $ \fun -> do 
     330 
    324331            -- if deltaFromCxt ret == 0 then return Nothing else do 
    325             let pairs = map (typeOfCxt . paramContext) prms 
    326                             `zip` (map unwrap $ maybeToList _invs ++ _args) 
     332            let pairs = [ typeOfParam p | p <- prms, not (isSlurpy p) ] `zip` _invs_args 
    327333            deltaCxt    <- deltaFromCxt ret 
    328334            deltaArgs   <- mapM deltaFromPair pairs 
     
    420426        var' = var{ v_meta = MNil } 
    421427        varInfix = var{ v_meta = MNil, v_categ = C_infix } 
     428 
     429typeOfParam :: Param -> Type 
     430typeOfParam p = case v_sigil (paramName p) of 
     431    SScalar -> typeOfCxt (paramContext p) 
     432    s       -> typeOfSigil s 
     433 
    422434 
    423435metaVar :: Pkg -> Var 
     
    642654    padSym pad var = do 
    643655        case lookupPad var pad of 
    644             Just tvar -> lift $ do 
    645                 refs <- liftSTM $ mapM readTVar tvar 
     656            Just tvars -> lift $ do 
     657                refs <- liftSTM $ mapM readTVar tvars 
    646658                forM refs $ \ref -> do 
    647659                    val <- readRef ref 
     
    649661            Nothing -> mzero 
    650662         
    651 arityMatch :: VCode -> Int -> Int -> Maybe VCode 
    652 arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } argLen argSlurpLen 
     663arityMatch :: VCode -> Int -> Int -> Int -> Maybe VCode 
     664arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } posLen namLen argSlurpLen 
    653665    | A_list <- assoc = Just sub 
    654666    | A_chain <- assoc = Just sub 
    655667    | isNothing $ find (not . isSlurpy) prms -- XXX - what about empty ones? 
    656668    , slurpLen <- length $ filter (\p -> isSlurpy p && v_sigil (paramName p) == SScalar) prms 
    657     , hasArray <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) /= SScalar) prms 
     669    , hasArray <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SArray) prms 
    658670    , if hasArray then slurpLen <= argSlurpLen else slurpLen == argSlurpLen 
    659671    = Just sub 
    660672    | reqLen <- length $ filter (\p -> not (isOptional p || isSlurpy p)) prms 
    661673    , optLen <- length $ filter (\p -> isOptional p) prms 
    662     , hasArray <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) /= SScalar) prms 
    663     , argLen >= reqLen && (hasArray || argLen <= (reqLen + optLen)) 
     674    , hasArray <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SArray) prms 
     675    , hasHash  <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SHash) prms 
     676    , argLen >= reqLen && (hasArray || (if hasHash then posLen else argLen) <= (reqLen + optLen)) 
    664677    = Just sub 
    665678    | otherwise 
    666679    = Nothing 
     680    where 
     681    argLen = posLen + namLen 
    667682 
    668683toPackage :: Pkg -> Var -> Var