Changeset 7035 for src/Pugs/Prim.hs

Show
Ignore:
Timestamp:
09/17/05 22:55:58 (3 years ago)
Author:
gaal
Message:

Lexical pragmas (WIP). See Pugs.AST.Prag. Dominus++.
This doesn't work yet, my pragmas got lost somewhere between the parser
and the evaluator.
TODO after it's fixed:
- throw away the cons list in favor of a primitive [] - it's enough
- figure out how to install other kinds of pragma data, not just Int

And, the fun part:
- use fatal
- use sort 'mergesort'
- no strict :-)
- other ideas from http://perl.plover.com/TPF/Pragmas/PROPOSAL

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim.hs

    r6918 r7035  
    598598        VRule MkRulePCRE{rxAdverbs=hash} -> return hash 
    599599        _ -> fail $ "Not a rule: " ++ show v 
     600op1 "Pugs::Internals::current_pragma_value" = \v -> do 
     601    name <- fromVal v 
     602    prags <- asks envPragmas 
     603    return $ findPrag name prags 
     604    where 
     605        findPrag :: String -> Pragmas -> Val 
     606        findPrag _ PrNil = VUndef 
     607        findPrag n PrPrags {pragma=this, pragmas=rest} 
     608            | n == pragName this = VInt $ toInteger $ pragDat this 
     609            | otherwise          = findPrag n rest 
     610op1 "Pugs::Internals::caller_pragma_value" = \v -> do 
     611    caller <- asks envCaller 
     612    case caller of 
     613        Just env -> local (const env) (op1 "Pugs::Internals::current_pragma_value" v) 
     614        _        -> return $ VUndef 
    600615op1 other   = \_ -> fail ("Unimplemented unaryOp: " ++ other) 
    601616 
     
    927942op2 "IO::print" = op2Print hPutStr 
    928943op2 "BUILDALL" = op1WalkAll reverse "BUILD" 
     944op2 "Pugs::Internals::install_pragma_value" = \x y -> do 
     945    name <- fromVal x 
     946    val  <- fromVal y 
     947    idat <- asks envInitDat 
     948    idatval <- liftSTM $ readTVar idat 
     949    trace ("installing " ++ name ++ "/" ++ (show val)) $ return () 
     950    let prag = initPragmas idatval 
     951    liftSTM $ writeTVar idat idatval{initPragmas =  
     952        prag ++ [MkPrag{ pragName=name, pragDat=val }]} 
     953    return (VBool True) 
    929954op2 other = \_ _ -> fail ("Unimplemented binaryOp: " ++ other) 
    930955 
     
    16781703\\n   Str       pre     Pugs::Internals::rule_pattern safe (Pugs::Internals::VRule)\ 
    16791704\\n   Hash      pre     Pugs::Internals::rule_adverbs safe (Pugs::Internals::VRule)\ 
     1705\\n   Int       pre     Pugs::Internals::install_pragma_value safe (Str, Int)\ 
     1706\\n   Bool      pre     Pugs::Internals::current_pragma_value safe (Str)\ 
     1707\\n   Bool      pre     Pugs::Internals::caller_pragma_value safe (Str)\ 
    16801708\\n"