Changeset 14176 for src/Pugs/Eval

Show
Ignore:
Timestamp:
10/09/06 20:32:35 (2 years ago)
Author:
audreyt
Message:

* Pugs.Eval.Var: Rewrite the multi-dispatch resolver:

  • Don't bother calculating type distance if it can't be bound.
  • If it's bound, only calculate type distances for the bound non-slurpy parts.
  • Named arguments are no longer rigged to always lose multi-dispatch.
  • Mixed named-vs-positional arguments are now handled correctly.


Files:
1 modified

Legend:

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

    r14141 r14176  
    321321    --     => Int -> [(Var, Val)] -> Eval [((Bool, Bool, Int, Int), VCode)] 
    322322    subs slurpLens subSyms = fmap catMaybes . forM subSyms $ \(_, val) -> do 
    323         sub@(MkCode{ subReturns = ret, subParams = prms }) <- fromVal val 
     323        sub@(MkCode{ subReturns = ret }) <- fromVal val 
    324324        let (named, positional) = partition isNamedArg _invs_args 
    325325            isNamedArg (Syn "named" _) = True 
     
    329329        maybeM rv $ \fun -> do 
    330330            -- if deltaFromCxt ret == 0 then return Nothing else do 
    331             let pairs = [ typeOfParam p | p <- prms, not (isSlurpy p) ] `zip` _invs_args 
    332             deltaCxt    <- deltaFromCxt ret 
    333             deltaArgs   <- mapM deltaFromPair pairs 
    334             let bound = either (const False) (const True) $ bindParams sub _invs _args 
    335             return ((isMulti sub, bound, sum deltaArgs, -(length deltaArgs), deltaCxt), fun) 
     331            (deltaArgs, deltaCxt) <- case bindParams sub _invs _args of 
     332                Left{}  -> return ([maxBound], 0) 
     333                Right s -> do 
     334                    cls <- asks envClasses 
     335                    ds  <- forM (subBindings s) $ \(prm, arg) -> case arg of 
     336                        Syn "param-default" _   -> return Nothing 
     337                        _  | isSlurpy prm       -> return Nothing 
     338                        _                       -> do 
     339                            argType <- inferExpType arg 
     340                            return (Just $ deltaType cls (typeOfParam prm) argType) 
     341                    cxt <- asks envContext 
     342                    return (catMaybes ds, deltaType cls (typeOfCxt cxt) ret) 
     343            return ((isMulti sub, sum deltaArgs, -(length deltaArgs), deltaCxt), fun) 
    336344 
    337345    -- findBuiltinSub :: (_var :: Var, _invs :: Maybe Exp, _args :: [Exp]) 
     
    452460    takeWord = takeWhile isWord . dropWhile (not . isWord) 
    453461    isWord   = not . (`elem` "(),:") 
    454  
    455 deltaFromCxt :: Type -> Eval Int 
    456 deltaFromCxt x  = do 
    457     cls <- asks envClasses 
    458     cxt <- asks envContext 
    459     return $ deltaType cls (typeOfCxt cxt) x 
    460  
    461 deltaFromPair :: (Type, Exp) -> Eval Int 
    462 deltaFromPair (x, y) = do 
    463     cls <- asks envClasses 
    464     typ <- inferExpType y 
    465     return $ deltaType cls x typ 
    466462 
    467463findAttrs :: Pkg -> Eval (Maybe [Pkg]) 
     
    515511inferExpType (Syn "%{}" _)  = return $ mkType "Hash" 
    516512inferExpType (Syn "=>" _)   = return $ mkType "Pair" 
     513inferExpType (Syn "named" [_, exp])   = inferExpType exp 
    517514inferExpType exp@(Syn "{}" [_, idxExp]) = if isSimpleExp exp 
    518515    then fromVal =<< enterRValue (evalExp exp)