git @ Cat's Eye Technologies Robin / experimental-envs
Remove exprToEnv completely. Chris Pressey 5 years ago
6 changed file(s) with 11 addition(s) and 57 deletion(s). Raw diff Collapse all Expand all
6565
6666 robinEnv :: Evaluable
6767 robinEnv i env (List _) cc =
68 cc $ envToExpr env
68 cc $ env
6969
7070 choose :: Evaluable
7171 choose i env (List [(List [(Symbol "else"), branch])]) cc =
103103 robinBindArgs i env (List [(List formals), givenArgs, givenEnvExpr, body]) cc =
104104 eval i env givenArgs (\(List actuals) ->
105105 eval i env givenEnvExpr (\outerEnvExpr ->
106 assertExprToEnv i outerEnvExpr (\outerEnv ->
107 evalArgs formals actuals actuals outerEnv i (\argEnv ->
108 eval i (mergeEnvs argEnv env) body cc))))
106 evalArgs formals actuals actuals outerEnvExpr i (\argEnv ->
107 eval i (mergeEnvs argEnv env) body cc)))
109108 robinBindArgs i env other cc = raise i $ errMsg "illegal-arguments" other
110109
111110 robinFun :: Evaluable
7171 (Symbol envFormal)]) = argList
7272 newEnv = insert argSelf m closedEnv
7373 newEnv' = insert argFormal actuals newEnv
74 newEnv'' = insert envFormal (envToExpr env) newEnv'
74 newEnv'' = insert envFormal env newEnv'
7575 in
7676 newEnv''
7777
9797 assertList i = assert i (isList) "expected-list"
9898 assertNumber i = assert i (isNumber) "expected-number"
9999 assertMacro i = assert i (isMacro) "expected-macro"
100
101 assertExprToEnv i envExpr k =
102 case exprToEnv envExpr of
103 Right env ->
104 k env
105 Left (msg, value) ->
106 raise i $ errMsg msg value
6868 | s == t = Just value
6969 | otherwise = find s (List rest)
7070 find s (List (_:rest)) = find s (List rest)
71 find _ (_) = Nothing
7172
7273 fromList :: [(String, Expr)] -> Env
7374 fromList [] = empty
8283
8384 append (List x) (List y) =
8485 List (x ++ y)
85
86 --
87 -- Given a list of pairs (two-elements lists) of symbols and values,
88 -- return either an Env where each symbol is associated with its value,
89 -- or an error message describing why the Env could not be created.
90 --
91
92 -- exprToEnv :: Expr -> Either (String, Expr) Env
93 -- exprToEnv (List []) = Right empty
94 -- exprToEnv (List (first:rest)) =
95 -- case first of
96 -- List [Symbol s, value] ->
97 -- case exprToEnv (List rest) of
98 -- Right remainder -> Right (insert s value remainder)
99 -- other -> other
100 -- List [other, _] ->
101 -- Left ("expected-symbol", other)
102 -- other ->
103 -- Left ("expected-env-entry", other)
104 -- exprToEnv other = Left ("expected-env-alist", other)
105
106
107 exprToEnv :: Expr -> Either (String, Expr) Env
108 exprToEnv env@(List _) = Right env
109 exprToEnv other = Left ("expected-env-alist", other)
110
111 envToExpr :: Env -> Expr
112 envToExpr env = env
11386
11487 --
11588 -- Predicates
7676 robinEval i env (List [envlist, form]) cc =
7777 eval i env envlist (\newEnvVal ->
7878 eval i env form (\body ->
79 case exprToEnv newEnvVal of
80 Right newEnv ->
81 eval i newEnv body cc
82 Left (msg, value) ->
83 raise i (errMsg msg value)))
79 eval i newEnvVal body cc))
8480 robinEval i env other cc = raise i (errMsg "illegal-arguments" other)
8581
8682 robinMacro :: Evaluable
2121 robinExpr str = insist $ parseExpr str
2222
2323 stdEval env expr = eval (IEnv stop) env expr id
24
25
26 propEnvExpr :: [(String, Int32)] -> Bool
27 propEnvExpr entries =
28 exprToEnv (envToExpr env) == Right env
29 where
30 env = fromList $ map (\(k,v) -> (k, Number v)) entries
3124
3225
3326 --
5649 stdEval env expr == Boolean True
5750 where
5851 expr = List [Symbol "env?", List [Symbol "literal", alist]]
59 alist = envToExpr $ fromList $ map (\(k,v) -> (k, Number v)) entries
52 alist = fromList $ map (\(k,v) -> (k, Number v)) entries
6053
6154
6255 --
6962 where
7063 litSym = List [Symbol "literal", Symbol sym]
7164 expr = List [Symbol "lookup", litSym, List [Symbol "delete", litSym, List [Symbol "literal", alist]]]
72 alist = envToExpr $ fromList $ map (\(k,v) -> (k, Number v)) entries
65 alist = fromList $ map (\(k,v) -> (k, Number v)) entries
7366
7467 --
7568 -- The following should be true for any symbol s and binding alist a:
8174 where
8275 litSym = List [Symbol "literal", Symbol sym]
8376 expr = List [Symbol "lookup", litSym, List [Symbol "extend", litSym, Number 1, List [Symbol "literal", alist]]]
84 alist = envToExpr $ fromList $ map (\(k,v) -> (k, Number v)) entries
77 alist = fromList $ map (\(k,v) -> (k, Number v)) entries
8578
8679
8780 testAll = do
4141
4242 `eval` will happily use whatever type of value you like as the
4343 environment, however, subsequent evaluation will fail when it
44 tries to look up things in that environment.
44 tries to look up things in that environment. FIXME: (expected-env-alist 103)
4545
4646 | (eval 103 (literal
4747 | (prepend (literal a)
4848 | (prepend (literal b) ()))))
49 ? uncaught exception: (expected-env-alist 103)
49 ? uncaught exception
5050
5151 Evaluation expects the contents of the list which makes up the
5252 environment to be two-element lists. FIXME