git @ Cat's Eye Technologies Robin / fed9dd4
It builds now, but many tests fail, some spectacularly. Chris Pressey 5 years ago
2 changed file(s) with 28 addition(s) and 18 deletion(s). Raw diff Collapse all Expand all
1717
1818 update :: Reactor -> Expr -> (Reactor, [Expr])
1919 update reactor@Reactor{rid=rid, env=env, state=state, body=body} event =
20 case eval (setExceptionHandler (Intrinsic "(exception-handler)" catchException) env) (List [body, event, state]) id of
21 command@(List [(Symbol "uncaught-exception"), expr]) ->
22 (reactor, [command])
23 (List (state':commands)) ->
24 (reactor{ state=state' }, applyStop commands)
25 expr ->
26 (reactor, [List [(Symbol "malformed-response"), expr]])
20 let
21 env' = setExceptionHandler (Intrinsic "(exception-handler)" catchException) env
22 in
23 case eval env' (List [body, event, state]) id of
24 command@(List [(Symbol "uncaught-exception"), expr]) ->
25 (reactor, [command])
26 (List (state':commands)) ->
27 (reactor{ state=state' }, applyStop commands)
28 expr ->
29 (reactor, [List [(Symbol "malformed-response"), expr]])
2730 where
2831 catchException env expr k = List [(Symbol "uncaught-exception"), expr]
2932
1010
1111 collect ((List [Symbol "display", expr]):rest) env reactors results =
1212 let
13 result = case eval (IEnv catchException) env expr id of
13 env' = setExceptionHandler (Intrinsic "(exception-handler)" catchException) env
14 result = case eval env' expr id of
1415 -- TODO This is less than fantastic. Should we have a dedicated error Expr?
1516 e@(List [(Symbol "uncaught-exception"), expr]) -> Left expr
1617 other -> Right other
1718 in
1819 collect rest env reactors (result:results)
1920 where
20 catchException expr = List [(Symbol "uncaught-exception"), expr]
21 catchException env expr k = List [(Symbol "uncaught-exception"), expr]
2122
2223 collect ((List [Symbol "assert", expr]):rest) env reactors results =
23 case eval (IEnv stop) env expr id of
24 Boolean False ->
25 error ("assertion failed: " ++ show expr)
26 _ ->
27 collect rest env reactors results
24 let
25 env' = setExceptionHandler (Intrinsic "(exception-handler)" stop) env
26 in
27 case eval env' expr id of
28 Boolean False ->
29 error ("assertion failed: " ++ show expr)
30 _ ->
31 collect rest env reactors results
2832
2933 collect ((List [Symbol "require", sym@(Symbol s)]):rest) env reactors results =
3034 case find s env of
3943 error ("symbol already defined: " ++ show sym)
4044 Nothing ->
4145 let
42 result = eval (IEnv stop) env expr id
46 env' = setExceptionHandler (Intrinsic "(exception-handler)" stop) env
47 result = eval env' expr id
4348 in
4449 collect rest (insert s result env) reactors results
4550
4954 collect rest env reactors results
5055 Nothing ->
5156 let
52 result = eval (IEnv stop) env expr id
57 env' = setExceptionHandler (Intrinsic "(exception-handler)" stop) env
58 result = eval env' expr id
5359 in
5460 collect rest (insert s result env) reactors results
5561
5662 collect ((List [Symbol "reactor", facExpr, stateExpr, bodyExpr]):rest) env reactors results =
5763 let
58 state = eval (IEnv stop) env stateExpr id
59 body = eval (IEnv stop) env bodyExpr id
64 env' = setExceptionHandler (Intrinsic "(exception-handler)" stop) env
65 state = eval env' stateExpr id
66 body = eval env' bodyExpr id
6067 newReactor = Reactor{ rid=(fromIntegral $ length reactors), env=env, state=state, body=body }
6168 in
6269 collect rest env (newReactor:reactors) results