@@ -5,7 +5,7 @@ use std::collections::HashMap;
5
5
use crate :: ast:: AST ;
6
6
use crate :: eval:: eval;
7
7
8
- pub fn print ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < AST , String > {
8
+ pub fn print ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < ( AST , AST ) , String > {
9
9
for arg in args {
10
10
match eval ( arg, context) {
11
11
Ok ( value) => {
@@ -20,10 +20,10 @@ pub fn print(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST,
20
20
21
21
println ! ( ) ;
22
22
23
- Ok ( AST :: Null )
23
+ Ok ( ( AST :: Null , AST :: Null ) )
24
24
}
25
25
26
- pub fn input ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < AST , String > {
26
+ pub fn input ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < ( AST , AST ) , String > {
27
27
if args. len ( ) > 0 {
28
28
use std:: io:: Write ;
29
29
@@ -46,30 +46,30 @@ pub fn input(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST,
46
46
47
47
std:: io:: stdin ( ) . read_line ( & mut input) . unwrap ( ) ;
48
48
49
- Ok ( AST :: String ( input. trim ( ) . to_string ( ) ) )
49
+ Ok ( ( AST :: String ( input. trim ( ) . to_string ( ) ) , AST :: Null ) )
50
50
}
51
51
52
- pub fn int ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < AST , String > {
52
+ pub fn int ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < ( AST , AST ) , String > {
53
53
match eval ( args[ 0 ] . clone ( ) , context) {
54
54
Ok ( v) => {
55
55
match v {
56
56
AST :: String ( value) => {
57
57
match value. parse :: < i64 > ( ) {
58
- Ok ( value) => { return Ok ( AST :: Number ( value) ) ; } ,
58
+ Ok ( value) => { return Ok ( ( AST :: Number ( value) , AST :: Null ) ) ; } ,
59
59
Err ( _) => ( ) ,
60
60
}
61
61
62
62
match value. parse :: < f64 > ( ) {
63
- Ok ( value) => { return Ok ( AST :: Number ( value as i64 ) ) ; } ,
63
+ Ok ( value) => { return Ok ( ( AST :: Number ( value as i64 ) , AST :: Null ) ) ; } ,
64
64
Err ( _) => ( ) ,
65
65
}
66
66
67
67
return Err ( "int() requires a string or boolean" . to_string ( ) ) ;
68
68
}
69
69
70
- AST :: Boolean ( value) => Ok ( AST :: Number ( if value { 1 } else { 0 } ) ) ,
70
+ AST :: Boolean ( value) => Ok ( ( AST :: Number ( if value { 1 } else { 0 } ) , AST :: Null ) ) ,
71
71
72
- AST :: Number ( value) => Ok ( AST :: Number ( value) ) ,
72
+ AST :: Number ( value) => Ok ( ( AST :: Number ( value) , AST :: Null ) ) ,
73
73
74
74
_ => Err ( "int() requires a string or boolean" . to_string ( ) )
75
75
}
@@ -79,21 +79,21 @@ pub fn int(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST, St
79
79
}
80
80
}
81
81
82
- pub fn float ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < AST , String > {
82
+ pub fn float ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < ( AST , AST ) , String > {
83
83
match eval ( args[ 0 ] . clone ( ) , context) {
84
84
Ok ( v) => {
85
85
match v {
86
86
AST :: String ( value) => {
87
87
match value. parse :: < f64 > ( ) {
88
- Ok ( value) => Ok ( AST :: Float ( value) ) ,
88
+ Ok ( value) => Ok ( ( AST :: Float ( value) , AST :: Null ) ) ,
89
89
Err ( _) => Err ( "float() requires a string or boolean" . to_string ( ) )
90
90
}
91
91
}
92
92
93
- AST :: Boolean ( value) => Ok ( AST :: Float ( if value { 1.0 } else { 0.0 } ) ) ,
93
+ AST :: Boolean ( value) => Ok ( ( AST :: Float ( if value { 1.0 } else { 0.0 } ) , AST :: Null ) ) ,
94
94
95
- AST :: Number ( value) => Ok ( AST :: Float ( value as f64 ) ) ,
96
- AST :: Float ( value) => Ok ( AST :: Float ( value) ) ,
95
+ AST :: Number ( value) => Ok ( ( AST :: Float ( value as f64 ) , AST :: Null ) ) ,
96
+ AST :: Float ( value) => Ok ( ( AST :: Float ( value) , AST :: Null ) ) ,
97
97
98
98
_ => Err ( "float() requires a string or boolean" . to_string ( ) )
99
99
}
@@ -103,16 +103,16 @@ pub fn float(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST,
103
103
}
104
104
}
105
105
106
- pub fn str ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < AST , String > {
106
+ pub fn str ( args : Vec < AST > , context : & mut HashMap < String , AST > ) -> Result < ( AST , AST ) , String > {
107
107
match eval ( args[ 0 ] . clone ( ) , context) {
108
108
Ok ( v) => {
109
109
match v {
110
- AST :: String ( value) => Ok ( AST :: String ( value) ) ,
110
+ AST :: String ( value) => Ok ( ( AST :: String ( value) , AST :: Null ) ) ,
111
111
112
- AST :: Number ( value) => Ok ( AST :: String ( value. to_string ( ) ) ) ,
113
- AST :: Float ( value) => Ok ( AST :: String ( value. to_string ( ) ) ) ,
114
- AST :: Boolean ( value) => Ok ( AST :: String ( value. to_string ( ) ) ) ,
115
- AST :: Null => Ok ( AST :: String ( "null" . to_string ( ) ) ) ,
112
+ AST :: Number ( value) => Ok ( ( AST :: String ( value. to_string ( ) ) , AST :: Null ) ) ,
113
+ AST :: Float ( value) => Ok ( ( AST :: String ( value. to_string ( ) ) , AST :: Null ) ) ,
114
+ AST :: Boolean ( value) => Ok ( ( AST :: String ( value. to_string ( ) ) , AST :: Null ) ) ,
115
+ AST :: Null => Ok ( ( AST :: String ( "null" . to_string ( ) ) , AST :: Null ) ) ,
116
116
117
117
_ => Err ( "str() requires a string, number or boolean" . to_string ( ) )
118
118
}
@@ -122,6 +122,6 @@ pub fn str(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST, St
122
122
}
123
123
}
124
124
125
- pub fn exit ( _: Vec < AST > , _: & mut HashMap < String , AST > ) -> Result < AST , String > {
125
+ pub fn exit ( _: Vec < AST > , _: & mut HashMap < String , AST > ) -> Result < ( AST , AST ) , String > {
126
126
std:: process:: exit ( 0 ) ;
127
127
}
0 commit comments