Changeset 13684 for src/Pugs/Eval

Show
Ignore:
Timestamp:
09/26/06 16:04:07 (2 years ago)
Author:
audreyt
Message:

* Implement hyperfold and hyperscan: [>>+<<] and [\>>+<<].

Files:
1 modified

Legend:

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

    r13614 r13684  
    370370        let rv = fmap (either (const Nothing) Just) $ 
    371371                findSub var Nothing firstTwoArgs 
    372         maybeM rv $ \code -> return $ metaPrim 
    373             { subAssoc    = subAssoc code 
    374             , subParams   = makeParams ["Any", "Any"] 
    375             , subBody     = Prim (\[x, y] -> op2Hyper code x y) 
    376             } 
    377  
    378     buildReduce var keep = do 
     372        maybeM rv (return . makeInfixHyperCode) 
     373 
     374    makeInfixHyperCode code = metaPrim 
     375        { subAssoc    = subAssoc code 
     376        , subParams   = makeParams ["Any", "Any"] 
     377        , subBody     = Prim (\[x, y] -> op2Hyper code x y) 
     378        } 
     379 
     380    buildReduce var foldOrScan nilOrHyper = do 
    379381        let rv = fmap (either (const Nothing) Just) $ 
    380382                findSub var Nothing firstTwoArgs 
     
    388390            , subBody     = Prim $ \[vs] -> do 
    389391                list_of_args <- fromVal vs 
    390                 op2Reduce keep list_of_args (VCode code) 
     392                op2Reduce (foldOrScan == MScan) list_of_args . VCode $ case nilOrHyper of 
     393                    MHyper  -> makeInfixHyperCode code 
     394                    _       -> code 
    391395            } 
    392396 
    393397    -- possiblyBuildMetaopVCode :: (_args :: [Exp]) => Var -> Eval (Maybe VCode) 
    394398    possiblyBuildMetaopVCode var@MkVar{ v_meta = meta } = case meta of 
    395         MPost   -> buildPrefixHyper var'         -- +<< 
    396         MPre    -> buildPostfixHyper var'        -- >>+ 
    397         MHyper  -> buildInfixHyper var'          -- >>+<< 
    398         MFold   -> buildReduce varInfix False    -- [+] 
    399         MScan   -> buildReduce varInfix True     -- [\+] 
    400         _       -> return Nothing 
     399        MPost       -> buildPrefixHyper var'                -- +<< 
     400        MPre        -> buildPostfixHyper var'               -- >>+ 
     401        MHyper      -> buildInfixHyper var'                 -- >>+<< 
     402        MFold       -> buildReduce varInfix MFold MNil      -- [+] 
     403        MScan       -> buildReduce varInfix MScan MNil      -- [\+] 
     404        MHyperFold  -> buildReduce varInfix MFold MHyper    -- [>>+<<] 
     405        MHyperScan  -> buildReduce varInfix MScan MHyper    -- [>>+<<] 
     406        _           -> return Nothing 
    401407        where 
    402408        var' = var{ v_meta = MNil }