rpn(1): added modulo
This commit is contained in:
parent
5debb9d954
commit
5f8e90b592
33
src/rpn.rs
33
src/rpn.rs
@ -50,7 +50,7 @@ use std::{
|
|||||||
process::ExitCode,
|
process::ExitCode,
|
||||||
};
|
};
|
||||||
|
|
||||||
use CalcType::{ Add, Divide, Multiply, Power, Subtract, Val };
|
use CalcType::{ Add, Divide, Modulo, Multiply, Power, Subtract, Val };
|
||||||
|
|
||||||
extern crate sysexits;
|
extern crate sysexits;
|
||||||
|
|
||||||
@ -64,6 +64,7 @@ enum CalcType {
|
|||||||
Multiply,
|
Multiply,
|
||||||
Divide,
|
Divide,
|
||||||
Power,
|
Power,
|
||||||
|
Modulo,
|
||||||
Val(f64),
|
Val(f64),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,6 +101,7 @@ fn str_to_calc_type(string: &str) -> Option<CalcType> {
|
|||||||
"*" => Some(Multiply),
|
"*" => Some(Multiply),
|
||||||
"/" => Some(Divide),
|
"/" => Some(Divide),
|
||||||
"^" => Some(Power),
|
"^" => Some(Power),
|
||||||
|
"%" => Some(Modulo),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -130,15 +132,16 @@ fn eval(
|
|||||||
};
|
};
|
||||||
|
|
||||||
match x {
|
match x {
|
||||||
Add | Divide | Multiply | Power | Subtract => ops.push_back(x),
|
Add | Divide | Multiply | Power | Subtract | Modulo => {
|
||||||
|
ops.push_back(x)
|
||||||
|
},
|
||||||
Val(x_) => stack.push_back(x_),
|
Val(x_) => stack.push_back(x_),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for op in &ops {
|
for op in &ops {
|
||||||
match op {
|
match op {
|
||||||
Add | Subtract | Multiply | Divide | Power => {
|
Add | Subtract | Multiply | Divide | Power | Modulo => {
|
||||||
let x = &stack.pop_back().ok_or(EvaluationError {
|
let x = &stack.pop_back().ok_or(EvaluationError {
|
||||||
message: "Stack is empty.".to_string(),
|
message: "Stack is empty.".to_string(),
|
||||||
})?;
|
})?;
|
||||||
@ -148,22 +151,12 @@ fn eval(
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
match op {
|
match op {
|
||||||
Add => {
|
Add => &stack.push_back(y + x),
|
||||||
&stack.push_back(y + x)
|
Subtract => &stack.push_back(y - x),
|
||||||
},
|
Multiply => &stack.push_back(y * x),
|
||||||
Subtract => {
|
Divide => &stack.push_back(y / x),
|
||||||
&stack.push_back(y - x)
|
Power => &stack.push_back(x.powf(*y)),
|
||||||
},
|
Modulo => &stack.push_back(y % x),
|
||||||
Multiply => {
|
|
||||||
&stack.push_back(y * x)
|
|
||||||
},
|
|
||||||
Divide => {
|
|
||||||
&stack.push_back(y / x)
|
|
||||||
},
|
|
||||||
Power => {
|
|
||||||
let result = x.powf(*y);
|
|
||||||
&stack.push_back(result)
|
|
||||||
},
|
|
||||||
_ => &{},
|
_ => &{},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user