@@ -5,7 +5,7 @@ use std::collections::HashMap;
55use crate :: ast:: AST ;
66use crate :: eval:: eval;
77
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 > {
99 for arg in args {
1010 match eval ( arg, context) {
1111 Ok ( value) => {
@@ -20,10 +20,10 @@ pub fn print(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST,
2020
2121 println ! ( ) ;
2222
23- Ok ( AST :: Null )
23+ Ok ( ( AST :: Null , AST :: Null ) )
2424}
2525
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 > {
2727 if args. len ( ) > 0 {
2828 use std:: io:: Write ;
2929
@@ -46,30 +46,30 @@ pub fn input(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST,
4646
4747 std:: io:: stdin ( ) . read_line ( & mut input) . unwrap ( ) ;
4848
49- Ok ( AST :: String ( input. trim ( ) . to_string ( ) ) )
49+ Ok ( ( AST :: String ( input. trim ( ) . to_string ( ) ) , AST :: Null ) )
5050}
5151
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 > {
5353 match eval ( args[ 0 ] . clone ( ) , context) {
5454 Ok ( v) => {
5555 match v {
5656 AST :: String ( value) => {
5757 match value. parse :: < i64 > ( ) {
58- Ok ( value) => { return Ok ( AST :: Number ( value) ) ; } ,
58+ Ok ( value) => { return Ok ( ( AST :: Number ( value) , AST :: Null ) ) ; } ,
5959 Err ( _) => ( ) ,
6060 }
6161
6262 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 ) ) ; } ,
6464 Err ( _) => ( ) ,
6565 }
6666
6767 return Err ( "int() requires a string or boolean" . to_string ( ) ) ;
6868 }
6969
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 ) ) ,
7171
72- AST :: Number ( value) => Ok ( AST :: Number ( value) ) ,
72+ AST :: Number ( value) => Ok ( ( AST :: Number ( value) , AST :: Null ) ) ,
7373
7474 _ => Err ( "int() requires a string or boolean" . to_string ( ) )
7575 }
@@ -79,21 +79,21 @@ pub fn int(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST, St
7979 }
8080}
8181
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 > {
8383 match eval ( args[ 0 ] . clone ( ) , context) {
8484 Ok ( v) => {
8585 match v {
8686 AST :: String ( value) => {
8787 match value. parse :: < f64 > ( ) {
88- Ok ( value) => Ok ( AST :: Float ( value) ) ,
88+ Ok ( value) => Ok ( ( AST :: Float ( value) , AST :: Null ) ) ,
8989 Err ( _) => Err ( "float() requires a string or boolean" . to_string ( ) )
9090 }
9191 }
9292
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 ) ) ,
9494
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 ) ) ,
9797
9898 _ => Err ( "float() requires a string or boolean" . to_string ( ) )
9999 }
@@ -103,16 +103,16 @@ pub fn float(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST,
103103 }
104104}
105105
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 > {
107107 match eval ( args[ 0 ] . clone ( ) , context) {
108108 Ok ( v) => {
109109 match v {
110- AST :: String ( value) => Ok ( AST :: String ( value) ) ,
110+ AST :: String ( value) => Ok ( ( AST :: String ( value) , AST :: Null ) ) ,
111111
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 ) ) ,
116116
117117 _ => Err ( "str() requires a string, number or boolean" . to_string ( ) )
118118 }
@@ -122,6 +122,6 @@ pub fn str(args: Vec<AST>, context: &mut HashMap<String, AST>) -> Result<AST, St
122122 }
123123}
124124
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 > {
126126 std:: process:: exit ( 0 ) ;
127127}
0 commit comments