Changeset 22172

Show
Ignore:
Timestamp:
09/06/08 18:03:57 (3 months ago)
Author:
pmurias
Message:

[pugs-m0ld] pattern matching is done with case instead of multiple function definitions

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/CodeGen/M0ld.hs

    r22171 r22172  
    88import Control.Monad.State 
    99 
    10 uniqueId = 
    11     do 
    12         modify (+1) 
    13         id <- get 
    14         return $ "$id"++(show id) 
     10uniqueId = do 
     11    modify (+1) 
     12    id <- get 
     13    return $ "$id"++(show id) 
    1514void = "$void" 
    1615 
     
    1918 
    2019instance EmitM0ld PIL_Environment where 
    21     emit x r = emit (pilMain x) r 
     20    emit env r = emit (pilMain env) r 
    2221instance EmitM0ld PIL_Stmts where 
    23     emit PNil r = return "nil" 
    24     emit PPad {} r = return "pad" 
    25     emit PStmts{pStmt=stmt,pStmts=PNil} r = (emit stmt void) 
    26     emit PStmts{pStmt=stmt,pStmts=rest} r = do  
    27         stmt <- emit stmt void 
    28         rest <- emit rest void 
    29         return $ stmt ++ rest 
     22    emit statement r = case statement of 
     23        PNil                           -> return "nil" 
     24        PPad {}                        -> return "pad" 
     25        PStmts{pStmt=stmt,pStmts=PNil} -> emit stmt r 
     26        PStmts{pStmt=stmt,pStmts=rest} -> do  
     27            stmt <- emit stmt void 
     28            rest <- emit rest void 
     29            return $ stmt ++ rest 
    3030 
    3131instance EmitM0ld PIL_Stmt where 
    32     emit PPos {pNode=stmt} r = emit stmt r 
    33     emit PNoop r = return "; #noop\n" 
    34     emit PStmt {pExpr=expr} r = emit expr r 
     32    emit statement r = case statement of  
     33        PPos {pNode=stmt}  -> emit stmt r 
     34        PNoop              -> return "; #noop\n" 
     35        PStmt {pExpr=expr} -> emit expr r 
    3536 
    3637instance EmitM0ld PIL_Expr where 
    37     emit PExp {pLV=lv} r = emit lv r 
    38     emit PCode {pBody=body} r = 
    39      do 
    40         ret <- uniqueId 
    41         body <- emit body ret 
    42         return ("my " ++ r ++ " = $Code.\"new\"(mold {\n" 
    43          ++ body 
    44          ++ void ++ " = $interpreter.\"return\"(" ++ ret ++ ");\n" 
    45          ++ "});\n") 
     38    emit expr r = case expr of  
     39        PExp {pLV=lv} -> emit lv r 
     40        PCode {pBody=body} -> do 
     41            ret <- uniqueId 
     42            body <- emit body ret 
     43            return ("my " ++ r ++ " = $Code.\"new\"(mold {\n" 
     44                ++ body 
     45                ++ void ++ " = $interpreter.\"return\"(" ++ ret ++ ");\n" 
     46                ++ "});\n") 
    4647 
    4748instance EmitM0ld PIL_LValue where 
    48     emit PApp {pFun=fun,pArgs=args,pInv=Nothing} r = 
    49      do 
    50         fun_r <- uniqueId 
    51         fun_code <- emit fun fun_r 
    52         return (fun_code ++ "my " ++ r ++ " = " ++ fun_r ++ ".\"postcircumfix:( )\"(" ++ (show args) ++ ");\n") 
    53     emit PApp {pFun=fun,pArgs=args,pInv=Just inv} r = 
    54      do 
    55         inv <- emit inv r 
    56         fun <- emit fun r 
    57         return (inv ++ ".(" ++ fun ++ ")(" ++ (show args) ++ ")") 
    58     emit PVar {pVarName=name} r = 
    59      do 
    60         return $ "my " ++ r ++ " = $scope.\"postcircumfix:{ }\"(\"" ++ name ++ "\");\n" 
    61     emit x r = return $ show x 
     49    emit lvalue r = case lvalue of 
     50        PApp {pFun=fun,pArgs=args,pInv=Nothing} -> do 
     51            fun_r <- uniqueId 
     52            fun_code <- emit fun fun_r 
     53            return (fun_code ++ "my " ++ r ++ " = " ++ fun_r ++ ".\"postcircumfix:( )\"(" ++ (show args) ++ ");\n") 
     54        PApp {pFun=fun,pArgs=args,pInv=Just inv} -> do 
     55            inv <- emit inv r 
     56            fun <- emit fun r 
     57            return (inv ++ ".(" ++ fun ++ ")(" ++ (show args) ++ ")") 
     58        PVar {pVarName=name} -> do 
     59            return $ "my " ++ r ++ " = $scope.\"postcircumfix:{ }\"(\"" ++ name ++ "\");\n" 
     60        other -> return $ show other  
    6261 
    6362genM0ld :: FilePath -> Eval Val 
    6463genM0ld filepath = do 
    6564    penv <- compile () :: Eval PIL_Environment 
    66     return $ VStr $ (evalState (emit penv "out") 0) ++ "\n" 
     65    return $ VStr $ (evalState (emit penv void) 0) ++ "\n"