@@ -8,6 +8,7 @@ pub mod errors;
8
8
pub mod database;
9
9
10
10
mod functions;
11
+ mod variables;
11
12
12
13
use types:: { Value , CallableType } ;
13
14
use representations:: SymbolicExpression ;
@@ -100,6 +101,26 @@ pub fn eval <'a> (exp: &SymbolicExpression, env: &'a mut Environment, context: &
100
101
}
101
102
102
103
104
+ fn is_reserved ( name : & str ) -> bool {
105
+ if let Some ( _result) = functions:: lookup_reserved_functions ( name) {
106
+ true
107
+ } else if variables:: is_reserved_variable ( name) {
108
+ true
109
+ } else {
110
+ false
111
+ }
112
+ }
113
+
114
+ fn check_legal_define ( name : & str , context : & Context ) -> Result < ( ) > {
115
+ if is_reserved ( name) {
116
+ Err ( Error :: ReservedName ( name. to_string ( ) ) )
117
+ } else if context. variables . contains_key ( name) || context. functions . contains_key ( name) {
118
+ Err ( Error :: MultiplyDefined ( name. to_string ( ) ) )
119
+ } else {
120
+ Ok ( ( ) )
121
+ }
122
+ }
123
+
103
124
/* This function evaluates a list of expressions, sharing a global context.
104
125
* It returns the final evaluated result.
105
126
*/
@@ -113,12 +134,15 @@ fn eval_all(expressions: &[SymbolicExpression],
113
134
let try_define = functions:: define:: evaluate_define ( exp, & mut env) ?;
114
135
match try_define {
115
136
DefineResult :: Variable ( name, value) => {
137
+ check_legal_define ( & name, & env. global_context ) ?;
116
138
env. global_context . variables . insert ( name, value) ;
117
139
} ,
118
140
DefineResult :: Function ( name, value) => {
141
+ check_legal_define ( & name, & env. global_context ) ?;
119
142
env. global_context . functions . insert ( name, value) ;
120
143
} ,
121
144
DefineResult :: Map ( name, key_type, value_type) => {
145
+ check_legal_define ( & name, & env. global_context ) ?;
122
146
env. database . create_map ( & name, key_type, value_type) ;
123
147
} ,
124
148
DefineResult :: NoDefine => {
0 commit comments