Changeset 12471 for src/Pugs/Eval

Show
Ignore:
Timestamp:
08/19/06 19:43:17 (2 years ago)
Author:
audreyt
Message:

* Pugs.Types and Pugs.Eval.Var: Make the choice of metaops

apparent during parsetime, by making use of the v_meta
slot in Var, instead of doing name mangling in runtime.

Files:
1 modified

Legend:

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

    r12469 r12471  
    333333        | otherwise         = take 2 _args 
    334334 
    335     buildPrefixHyper name var = do 
     335    metaPrim = mkPrim 
     336        { subName = cast (v_name _var) 
     337        , subType     = SubPrim 
     338        , subReturns  = mkType "List" 
     339        } 
     340 
     341    buildPrefixHyper var = do 
    336342        let rv = fmap (either (const Nothing) Just) $ 
    337343                findSub var Nothing firstArg 
    338         maybeM rv $ \code -> return $ mkPrim 
    339             { subName     = name 
    340             , subType     = SubPrim 
    341             , subAssoc    = subAssoc code 
     344        maybeM rv $ \code -> return $ metaPrim 
     345            { subAssoc    = subAssoc code 
    342346            , subParams   = subParams code 
    343             , subReturns  = mkType "List" 
    344347            , subBody     = Prim 
    345348                (\x -> op1HyperPrefix code (listArg x)) 
    346349            } 
    347350 
    348     buildPostfixHyper name var = do 
     351    buildPostfixHyper var = do 
    349352        let rv = fmap (either (const Nothing) Just) $ 
    350353                findSub var Nothing firstArg 
    351         maybeM rv $ \code -> return $ mkPrim 
    352             { subName     = name 
    353             , subType     = SubPrim 
    354             , subAssoc    = subAssoc code 
     354        maybeM rv $ \code -> return $ metaPrim 
     355            { subAssoc    = subAssoc code 
    355356            , subParams   = subParams code 
    356             , subReturns  = mkType "List" 
    357357            , subBody     = Prim 
    358358                (\x -> op1HyperPostfix code (listArg x)) 
    359359            } 
    360360 
    361     buildInfixHyper name var = do 
     361    buildInfixHyper var = do 
    362362        let rv = fmap (either (const Nothing) Just) $ 
    363363                findSub var Nothing firstTwoArgs 
    364         maybeM rv $ \code -> return $ mkPrim 
    365             { subName     = name 
    366             , subType     = SubPrim 
    367             , subAssoc    = subAssoc code 
     364        maybeM rv $ \code -> return $ metaPrim 
     365            { subAssoc    = subAssoc code 
    368366            , subParams   = makeParams ["Any", "Any"] 
    369             , subReturns  = mkType "List" 
    370367            , subBody     = Prim (\[x, y] -> op2Hyper code x y) 
    371368            } 
    372369 
     370    buildReduce var keep = do 
     371        let rv = fmap (either (const Nothing) Just) $ 
     372                findSub var Nothing firstTwoArgs 
     373        maybeM rv $ \code -> return $ metaPrim 
     374            { subAssoc    = ANil 
     375            , subParams   = makeParams $ 
     376                if any isLValue (subParams code) 
     377                    then ["rw!List"] -- XXX - does not yet work for the [=] case 
     378                    else ["List"] 
     379            , subReturns  = anyType 
     380            , subBody     = Prim $ \[vs] -> do 
     381                list_of_args <- fromVal vs 
     382                op2Reduce keep list_of_args (VCode code) 
     383            } 
     384 
    373385    -- possiblyBuildMetaopVCode :: (_args :: [Exp]) => Var -> Eval (Maybe VCode) 
    374     possiblyBuildMetaopVCode var@MkVar{ v_categ = cat, v_name = name } 
    375         | C_prefix <- cat, __"\194\171" `Str.isSuffixOf` buf = do 
    376             buildPrefixHyper buf var{ v_name = cast $ dropEnd 2 buf } 
    377         | C_prefix <- cat, __"<<" `Str.isSuffixOf` buf = do 
    378             buildPrefixHyper buf var{ v_name = cast $ dropEnd 2 buf } 
    379         | C_postfix <- cat, __"\194\187" `Str.isPrefixOf` buf = do 
    380             buildPostfixHyper buf var{ v_name = cast $ Str.drop 2 buf } 
    381         | C_postfix <- cat, __">>" `Str.isPrefixOf` buf = do 
    382             buildPostfixHyper buf var{ v_name = cast $ Str.drop 2 buf } 
    383         | C_infix <- cat 
    384         , __"\194\187" `Str.isPrefixOf` buf 
    385         , __"\194\171" `Str.isSuffixOf` buf = do 
    386             buildInfixHyper buf var{ v_name = cast $ Str.drop 2 (dropEnd 2 buf) } 
    387         | C_infix <- cat 
    388         , __">>" `Str.isPrefixOf` buf 
    389         , __"<<" `Str.isSuffixOf` buf = do 
    390             buildInfixHyper buf var{ v_name = cast $ Str.drop 2 (dropEnd 2 buf) } 
    391         | C_prefix <- cat, '[' <- Str.head buf, ']' <- Str.last buf = do 
    392             -- Strip the trailing "]" from op 
    393             let (op, keep) 
    394                     | Str.index buf 1 == '\\'   = (Str.drop 2 (Str.init buf), True) 
    395                     | otherwise                 = (Str.tail (Str.init buf), False) 
    396  
    397             -- We try to find the userdefined sub. 
    398             -- We use the first two elements of invs as invocants, as these are the 
    399             -- types of the op. 
    400                 rv = fmap (either (const Nothing) Just) $ 
    401                     findSub (var{ v_categ = C_infix, v_name = cast op }) Nothing 
    402                         firstTwoArgs 
    403             maybeM rv $ \code -> return $ mkPrim 
    404                 { subName     = buf 
    405                 , subType     = SubPrim 
    406                 , subAssoc    = ANil 
    407                 , subParams   = makeParams $ 
    408                     if any isLValue (subParams code) 
    409                         then ["rw!List"] -- XXX - does not yet work for the [=] case 
    410                         else ["List"] 
    411                 , subReturns  = anyType 
    412                 , subBody     = Prim $ \[vs] -> do 
    413                     list_of_args <- fromVal vs 
    414                     op2Reduce keep list_of_args (VCode code) 
    415                 } 
    416             -- Now we construct the sub. Is there a more simple way to do it? 
    417         | otherwise = return Nothing 
     386    possiblyBuildMetaopVCode var@MkVar{ v_name = name, v_meta = meta } 
     387        | MPost     <- meta = buildPrefixHyper var'         -- +<< 
     388        | MPre      <- meta = buildPostfixHyper var'        -- >>+ 
     389        | MHyper    <- meta = buildInfixHyper var'          -- >>+<< 
     390        | MFold     <- meta = buildReduce varInfix False    -- [+] 
     391        | MScan     <- meta = buildReduce varInfix True     -- [\+] 
     392        | otherwise         = return Nothing 
    418393        where 
    419         buf = cast name 
     394        var' = var{ v_meta = MNil } 
     395        varInfix = var{ v_meta = MNil, v_categ = C_infix } 
    420396 
    421397metaVar :: Pkg -> Var