1
-
2
1
use crate :: ir:: ast:: Function ;
3
2
use crate :: ir:: ast:: Name ;
4
3
@@ -7,96 +6,97 @@ use std::collections::LinkedList;
7
6
8
7
pub struct Scope < A > {
9
8
pub variables : HashMap < Name , A > ,
10
- pub functions : HashMap < Name , Function >
9
+ pub functions : HashMap < Name , Function > ,
11
10
}
12
11
13
12
impl < A > Scope < A > {
14
13
fn new ( ) -> Scope < A > {
15
- Scope { variables : HashMap :: new ( ) , functions : HashMap :: new ( ) }
14
+ Scope {
15
+ variables : HashMap :: new ( ) ,
16
+ functions : HashMap :: new ( ) ,
17
+ }
16
18
}
17
19
18
20
fn map_variable ( & mut self , var : Name , value : A ) -> ( ) {
19
- self . variables . insert ( var, value) ;
20
- return ( )
21
+ self . variables . insert ( var, value) ;
22
+ return ( ) ;
21
23
}
22
24
23
25
fn lookup ( & mut self , var : Name ) -> Option < & A > {
24
- self . variables . get ( & var)
26
+ self . variables . get ( & var)
25
27
}
26
28
}
27
29
28
30
pub struct Environment < A > {
29
31
pub globals : Scope < A > ,
30
- pub stack : LinkedList < Scope < A > >
32
+ pub stack : LinkedList < Scope < A > > ,
31
33
}
32
34
33
35
impl < A > Environment < A > {
34
-
35
36
pub fn new ( ) -> Environment < A > {
36
- Environment { globals : Scope :: new ( ) , stack : LinkedList :: new ( ) }
37
+ Environment {
38
+ globals : Scope :: new ( ) ,
39
+ stack : LinkedList :: new ( ) ,
40
+ }
37
41
}
38
-
42
+
39
43
pub fn map_variable ( & mut self , var : Name , value : A ) -> ( ) {
40
- match self . stack . front_mut ( ) {
41
- None => self . globals . map_variable ( var, value) ,
42
- Some ( top) => top. map_variable ( var, value)
43
-
44
- } ;
45
- return ( )
44
+ match self . stack . front_mut ( ) {
45
+ None => self . globals . map_variable ( var, value) ,
46
+ Some ( top) => top. map_variable ( var, value) ,
47
+ } ;
48
+ return ( ) ;
46
49
}
47
50
48
51
pub fn lookup ( & mut self , var : Name ) -> Option < & A > {
49
- match self . stack . front_mut ( ) {
50
- None => self . globals . lookup ( var) ,
51
- Some ( top) => top. lookup ( var)
52
- }
52
+ match self . stack . front_mut ( ) {
53
+ None => self . globals . lookup ( var) ,
54
+ Some ( top) => top. lookup ( var) ,
55
+ }
53
56
}
54
57
55
58
pub fn push ( & mut self ) -> ( ) {
56
- self . stack . push_front ( Scope :: new ( ) ) ;
59
+ self . stack . push_front ( Scope :: new ( ) ) ;
57
60
}
58
61
59
62
pub fn pop ( & mut self ) -> ( ) {
60
- self . stack . pop_front ( ) ;
63
+ self . stack . pop_front ( ) ;
61
64
}
62
65
}
63
66
64
-
65
67
#[ cfg( test) ]
66
68
mod tests {
67
- use crate :: environment:: environment:: { Scope , Environment } ;
68
-
69
+ use crate :: environment:: environment:: { Environment , Scope } ;
70
+
69
71
#[ test]
70
72
fn eval_map_and_lookup_var ( ) {
71
- let mut s: Scope < i32 > = Scope :: new ( ) ;
73
+ let mut s: Scope < i32 > = Scope :: new ( ) ;
74
+
75
+ s. map_variable ( "x" . to_string ( ) , 32 ) ;
76
+ s. map_variable ( "y" . to_string ( ) , 23 ) ;
72
77
73
- s. map_variable ( "x" . to_string ( ) , 32 ) ;
74
- s. map_variable ( "y" . to_string ( ) , 23 ) ;
75
-
76
- assert_eq ! ( Some ( 32 ) , s. lookup( "x" . to_string( ) ) . copied( ) ) ;
77
- assert_eq ! ( Some ( 23 ) , s. lookup( "y" . to_string( ) ) . copied( ) ) ;
78
+ assert_eq ! ( Some ( 32 ) , s. lookup( "x" . to_string( ) ) . copied( ) ) ;
79
+ assert_eq ! ( Some ( 23 ) , s. lookup( "y" . to_string( ) ) . copied( ) ) ;
78
80
}
79
81
80
82
#[ test]
81
83
fn eval_environment ( ) {
82
- let mut env: Environment < i32 > = Environment :: new ( ) ;
84
+ let mut env: Environment < i32 > = Environment :: new ( ) ;
83
85
84
- env. map_variable ( "x" . to_string ( ) , 32 ) ;
86
+ env. map_variable ( "x" . to_string ( ) , 32 ) ;
85
87
86
- env. push ( ) ;
88
+ env. push ( ) ;
87
89
88
- env. map_variable ( "x" . to_string ( ) , 55 ) ;
89
- env. map_variable ( "y" . to_string ( ) , 23 ) ;
90
-
91
- assert_eq ! ( Some ( 55 ) , env. lookup( "x" . to_string( ) ) . copied( ) ) ;
92
- assert_eq ! ( Some ( 23 ) , env. lookup( "y" . to_string( ) ) . copied( ) ) ;
93
- assert_eq ! ( None , env. lookup( "a" . to_string( ) ) . copied( ) ) ;
90
+ env. map_variable ( "x" . to_string ( ) , 55 ) ;
91
+ env. map_variable ( "y" . to_string ( ) , 23 ) ;
94
92
95
- env. pop ( ) ;
93
+ assert_eq ! ( Some ( 55 ) , env. lookup( "x" . to_string( ) ) . copied( ) ) ;
94
+ assert_eq ! ( Some ( 23 ) , env. lookup( "y" . to_string( ) ) . copied( ) ) ;
95
+ assert_eq ! ( None , env. lookup( "a" . to_string( ) ) . copied( ) ) ;
96
96
97
- assert_eq ! ( Some ( 32 ) , env. lookup( "x" . to_string( ) ) . copied( ) ) ;
98
- assert_eq ! ( None , env. lookup( "y" . to_string( ) ) . copied( ) ) ;
99
- }
100
-
97
+ env. pop ( ) ;
101
98
99
+ assert_eq ! ( Some ( 32 ) , env. lookup( "x" . to_string( ) ) . copied( ) ) ;
100
+ assert_eq ! ( None , env. lookup( "y" . to_string( ) ) . copied( ) ) ;
101
+ }
102
102
}
0 commit comments