Changeset 13752 for src/Pugs/Eval

Show
Ignore:
Timestamp:
09/30/06 17:20:14 (2 years ago)
Author:
audreyt
Message:

* Support for postfix reduction forms:

[+]<<
[\+]<<
[>>+<<]<<
[>>\+<<]<<

Files:
1 modified

Legend:

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

    r13738 r13752  
    352352        let rv = fmap (either (const Nothing) Just) $ 
    353353                findSub var Nothing firstArg 
    354         maybeM rv $ \code -> return $ metaPrim 
    355             { subAssoc    = subAssoc code 
    356             , subParams   = subParams code 
    357             , subBody     = Prim 
    358                 (\x -> op1HyperPrefix code (listArg x)) 
    359             } 
     354        maybeM rv (return . makePrefixHyperCode) 
     355         
     356    makePrefixHyperCode code = metaPrim 
     357        { subAssoc    = subAssoc code 
     358        , subParams   = subParams code 
     359        , subBody     = Prim 
     360            (\x -> op1HyperPrefix code (listArg x)) 
     361        } 
    360362 
    361363    buildPostfixHyper var = do 
     
    380382        } 
    381383 
    382     buildReduce var foldOrScan nilOrHyper = do 
     384    buildReduce var foldOrScan nilOrHyper nilOrPost = do 
    383385        let rv = fmap (either (const Nothing) Just) $ 
    384386                findSub var Nothing firstTwoArgs 
    385         maybeM rv $ \code -> return $ metaPrim 
     387        maybeM rv $ \code -> return . maybePost $ metaPrim 
    386388            { subAssoc    = ANil 
    387389            , subParams   = makeParams $ 
     
    396398                    _       -> code 
    397399            } 
     400        where 
     401        maybePost  
     402            | MPost <- nilOrPost    = makePrefixHyperCode 
     403            | otherwise             = id 
    398404 
    399405    -- possiblyBuildMetaopVCode :: (_args :: [Exp]) => Var -> Eval (Maybe VCode) 
    400406    possiblyBuildMetaopVCode var@MkVar{ v_meta = meta } = case meta of 
    401         MPost       -> buildPrefixHyper var'                -- +<< 
    402         MPre        -> buildPostfixHyper var'               -- >>+ 
    403         MHyper      -> buildInfixHyper var'                 -- >>+<< 
    404         MFold       -> buildReduce varInfix MFold MNil      -- [+] 
    405         MScan       -> buildReduce varInfix MScan MNil      -- [\+] 
    406         MHyperFold  -> buildReduce varInfix MFold MHyper    -- [>>+<<] 
    407         MHyperScan  -> buildReduce varInfix MScan MHyper    -- [>>+<<] 
    408         _           -> return Nothing 
     407        MPost           -> buildPrefixHyper var'                    -- +<< 
     408        MPre            -> buildPostfixHyper var'                   -- >>+ 
     409        MHyper          -> buildInfixHyper var'                     -- >>+<< 
     410        MFold           -> buildReduce varInfix MFold MNil MNil     -- [+] 
     411        MScan           -> buildReduce varInfix MScan MNil MNil     -- [\+] 
     412        MFoldPost       -> buildReduce varInfix MFold MNil MPost    -- [+] 
     413        MScanPost       -> buildReduce varInfix MScan MNil MPost    -- [\+] 
     414        MHyperFold      -> buildReduce varInfix MFold MHyper MNil   -- [>>+<<] 
     415        MHyperScan      -> buildReduce varInfix MScan MHyper MNil   -- [>>+<<] 
     416        MHyperFoldPost  -> buildReduce varInfix MFold MHyper MPost  -- [>>+<<] 
     417        MHyperScanPost  -> buildReduce varInfix MScan MHyper MPost  -- [>>+<<] 
     418        _               -> return Nothing 
    409419        where 
    410420        var' = var{ v_meta = MNil }