66 | 66 |
> in do
|
67 | 67 |
> mod <- readFile filename
|
68 | 68 |
> ast <- return $ insistParse mod
|
69 | |
> expr <- evalRobin mc ast
|
70 | |
> return (mc, expr)
|
|
69 |
> evalRobin mc ast
|
71 | 70 |
|
72 | 71 |
> loadModules :: ModuleCache -> Expr -> IO (ModuleCache, Expr)
|
73 | 72 |
|
|
75 | 74 |
> return (mc, Env.empty)
|
76 | 75 |
> loadModules mc (Pair (Symbol name) (Pair version rest)) = do
|
77 | 76 |
> (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)
|
81 | 80 |
|
82 | 81 |
> parseVersion (Pair (Number major) (Number minor)) = do
|
83 | 82 |
> case (denominator major, denominator minor) of
|
84 | 83 |
> (1, 1) -> return (numerator major, numerator minor)
|
85 | 84 |
> _ -> error "version number components can't be fractions"
|
86 | 85 |
|
|
86 |
> evalRobin :: ModuleCache -> Expr -> IO (ModuleCache, Expr)
|
|
87 |
|
87 | 88 |
> evalRobin mc (Pair (Symbol "robin") (Pair version (Pair modules (Pair expr Null)))) = do
|
88 | 89 |
> (major, minor) <- parseVersion version
|
89 | 90 |
> case (major, minor) of
|
90 | 91 |
> (0, 1) -> do
|
91 | |
> initialEnv <- loadModules mc modules
|
|
92 |
> (mc', initialEnv) <- loadModules mc modules
|
92 | 93 |
> threadId <- myThreadId
|
93 | 94 |
> chan <- newChan
|
94 | 95 |
> 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)
|
96 | 98 |
> _ -> error ("unsupported language version " ++ show version)
|