git @ Cat's Eye Technologies Robin / 1b5e011
Finally, unbreak module-loading. catseye 13 years ago
2 changed file(s) with 11 addition(s) and 9 deletion(s). Raw diff Collapse all Expand all
22 > import System
33
44 > import Robin.Parser (parseRobin)
5 > import Robin.Module (evalRobin)
5 > import Robin.Module (evalRobin, mkModuleCache)
66
77 Command-line Entry Point
88 ------------------------
2121 > program <- readFile filename
2222 > case parseRobin program of
2323 > Right ast -> do
24 > result <- evalRobin nonBuiltinModules ast
24 > (_, result) <- evalRobin (mkModuleCache nonBuiltinModules) ast
2525 > case printResult of
2626 > True -> do
2727 > putStrLn $ show result
6666 > in do
6767 > mod <- readFile filename
6868 > ast <- return $ insistParse mod
69 > expr <- evalRobin mc ast
70 > return (mc, expr)
69 > evalRobin mc ast
7170
7271 > loadModules :: ModuleCache -> Expr -> IO (ModuleCache, Expr)
7372
7574 > return (mc, Env.empty)
7675 > loadModules mc (Pair (Symbol name) (Pair version rest)) = do
7776 > (major, minor) <- parseVersion version
78 > nextEnv <- loadModules mc rest
79 > thisEnv <- loadModule mc (name, major, minor)
80 > return (mc, Env.union nextEnv thisEnv)
77 > (mc', nextEnv) <- loadModules mc rest
78 > (mc'', thisEnv) <- loadModule mc' (name, major, minor)
79 > return (mc'', Env.union nextEnv thisEnv)
8180
8281 > parseVersion (Pair (Number major) (Number minor)) = do
8382 > case (denominator major, denominator minor) of
8483 > (1, 1) -> return (numerator major, numerator minor)
8584 > _ -> error "version number components can't be fractions"
8685
86 > evalRobin :: ModuleCache -> Expr -> IO (ModuleCache, Expr)
87
8788 > evalRobin mc (Pair (Symbol "robin") (Pair version (Pair modules (Pair expr Null)))) = do
8889 > (major, minor) <- parseVersion version
8990 > case (major, minor) of
9091 > (0, 1) -> do
91 > initialEnv <- loadModules mc modules
92 > (mc', initialEnv) <- loadModules mc modules
9293 > threadId <- myThreadId
9394 > chan <- newChan
9495 > let ienv = newIEnv (stop) threadId chan
95 > eval initialEnv ienv expr (\x -> do return x)
96 > result <- eval initialEnv ienv expr (\x -> do return x)
97 > return (mc', result)
9698 > _ -> error ("unsupported language version " ++ show version)