Changeset 13827 for src/Pugs/Eval

Show
Ignore:
Timestamp:
10/03/06 16:24:40 (2 years ago)
Author:
audreyt
Message:

* Further tweaks to the slurpy-param model. The quicksort

example was broken all along, and this commit removes the
previous made-it-work kluge:

multi quicksort () { () }
multi quicksort (*$x, *@xs) { ... }

my @x;
quicksort(@x); # this should not have succeeded!

It was binding to variant #1, but there's really nothing
there that would cause it to bind that way. I think rewriting
the example to "quicksort(|@x)" is the sanest approach, but
that'll have to wait till tomorrow as |@x doesn't work at this
moment...

Files:
1 modified

Legend:

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

    r13823 r13827  
    290290        subSyms     <- findSyms var 
    291291        lens        <- mapM argSlurpLen _invs_args 
    292         doFindSub (sum lens) subSyms 
     292        doFindSub lens subSyms 
    293293 
    294294    argSlurpLen :: Exp -> Eval Int 
     
    309309    -- doFindSub :: (_var :: Var, _invs :: Maybe Exp, _args :: [Exp]) 
    310310    --     => Int -> [(Var, Val)] -> Eval (Maybe VCode) 
    311     doFindSub slurpLen subSyms = do 
    312         subs' <- subs slurpLen subSyms 
     311    doFindSub slurpLens subSyms = do 
     312        subs' <- subs slurpLens subSyms 
    313313        -- let foo (x, sub) = show x ++ show (map paramContext $ subParams sub) 
    314314        -- trace (unlines $ map foo $ sort subs') return () 
     
    321321    -- subs :: (_invs :: Maybe Exp, _args :: [Exp]) 
    322322    --     => Int -> [(Var, Val)] -> Eval [((Bool, Bool, Int, Int), VCode)] 
    323     subs slurpLen subSyms = fmap catMaybes . forM subSyms $ \(_, val) -> do 
     323    subs slurpLens subSyms = fmap catMaybes . forM subSyms $ \(_, val) -> do 
    324324        sub@(MkCode{ subReturns = ret, subParams = prms }) <- fromVal val 
    325325        let (named, positional) = partition isNamedArg _invs_args 
    326326            isNamedArg (Syn "named" _) = True 
    327327            isNamedArg _               = False 
    328             rv = return $ arityMatch sub (length positional) (length named) slurpLen 
     328            rv = return $ arityMatch sub (length positional) (length named) slurpLens 
    329329 
    330330        maybeM rv $ \fun -> do 
     
    655655            Nothing -> mzero 
    656656         
    657 arityMatch :: VCode -> Int -> Int -> Int -> Maybe VCode 
    658 arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } posLen namLen argSlurpLen 
     657arityMatch :: VCode -> Int -> Int -> [Int] -> Maybe VCode 
     658arityMatch sub@MkCode{ subAssoc = assoc, subParams = prms } posLen namLen argSlurpLens 
    659659    | A_list    <- assoc = Just sub 
    660660    | A_chain   <- assoc = Just sub 
    661661 
     662{- 
    662663    | isNothing $ find (not . isSlurpy) prms -- XXX - what about empty ones? 
    663664    , slurpLen  <- length $ filter (\p -> isSlurpy p && v_sigil (paramName p) == SScalar) prms 
     
    665666    , if hasArray then slurpLen <= argSlurpLen else slurpLen == argSlurpLen 
    666667    = Just sub 
    667  
    668     | reqLen    <- length $ filter (\p -> not (isOptional p || (isSlurpy p && v_sigil (paramName p) /= SScalar))) prms 
     668-} 
     669 
     670    | reqLen    <- length $ filter (\p -> not (isOptional p || isSlurpy p)) prms 
    669671    , optLen    <- length $ filter (\p -> isOptional p) prms 
    670672    , hasArray  <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SArray) prms 
    671673    , hasHash   <- isJust $ find (\p -> isSlurpy p && v_sigil (paramName p) == SHash) prms 
     674    , slurpLen  <- length $ filter (\p -> isSlurpy p && v_sigil (paramName p) == SScalar) prms 
    672675    , argLen >= reqLen && (hasArray || (if hasHash then posLen else argLen) <= (reqLen + optLen)) 
     676    , if hasArray then slurpLen <= sum (drop reqLen argSlurpLens) else slurpLen == sum (drop argLen argSlurpLens) 
    673677    = Just sub 
    674678