Changeset 13792 for src/Pugs/Eval
- Timestamp:
- 10/02/06 16:56:49 (2 years ago)
- Files:
-
- 1 modified
-
src/Pugs/Eval/Var.hs (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Eval/Var.hs
r13770 r13792 289 289 findSub' var = do 290 290 subSyms <- findSyms var 291 lens <- mapM argSlurpLen (unwrap $ maybeToList _invs ++ _args)291 lens <- mapM argSlurpLen _invs_args 292 292 doFindSub (sum lens) subSyms 293 293 … … 297 297 val <- enterLValue $ evalExp (Var name) 298 298 valSlurpLen val 299 argSlurpLen (Syn "," list) = return $ length list 299 argSlurpLen (Syn "," list) = return $ length list 300 argSlurpLen (Syn "named" _) = return 0 300 301 argSlurpLen _ = return 1 -- XXX 301 302 … … 316 317 _ -> Nothing 317 318 319 _invs_args = map unwrap (maybe _args (:_args) _invs) 320 318 321 -- subs :: (_invs :: Maybe Exp, _args :: [Exp]) 319 322 -- => Int -> [(Var, Val)] -> Eval [((Bool, Bool, Int, Int), VCode)] 320 323 subs slurpLen subSyms = fmap catMaybes . forM subSyms $ \(_, val) -> do 321 324 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 323 329 maybeM rv $ \fun -> do 330 324 331 -- 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 327 333 deltaCxt <- deltaFromCxt ret 328 334 deltaArgs <- mapM deltaFromPair pairs … … 420 426 var' = var{ v_meta = MNil } 421 427 varInfix = var{ v_meta = MNil, v_categ = C_infix } 428 429 typeOfParam :: Param -> Type 430 typeOfParam p = case v_sigil (paramName p) of 431 SScalar -> typeOfCxt (paramContext p) 432 s -> typeOfSigil s 433 422 434 423 435 metaVar :: Pkg -> Var … … 642 654 padSym pad var = do 643 655 case lookupPad var pad of 644 Just tvar -> lift $ do645 refs <- liftSTM $ mapM readTVar tvar 656 Just tvars -> lift $ do 657 refs <- liftSTM $ mapM readTVar tvars 646 658 forM refs $ \ref -> do 647 659 val <- readRef ref … … 649 661 Nothing -> mzero 650 662 651 arityMatch :: VCode -> Int -> Int -> Maybe VCode652 arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } argLen argSlurpLen663 arityMatch :: VCode -> Int -> Int -> Int -> Maybe VCode 664 arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } posLen namLen argSlurpLen 653 665 | A_list <- assoc = Just sub 654 666 | A_chain <- assoc = Just sub 655 667 | isNothing $ find (not . isSlurpy) prms -- XXX - what about empty ones? 656 668 , slurpLen <- length $ filter (\p -> isSlurpy p && v_sigil (paramName p) == SScalar) prms 657 , hasArray <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) /= SScalar) prms669 , hasArray <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SArray) prms 658 670 , if hasArray then slurpLen <= argSlurpLen else slurpLen == argSlurpLen 659 671 = Just sub 660 672 | reqLen <- length $ filter (\p -> not (isOptional p || isSlurpy p)) prms 661 673 , 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)) 664 677 = Just sub 665 678 | otherwise 666 679 = Nothing 680 where 681 argLen = posLen + namLen 667 682 668 683 toPackage :: Pkg -> Var -> Var
