Skip to content

Instantly share code, notes, and snippets.

@Daiver
Last active August 29, 2015 14:27
Show Gist options
  • Save Daiver/58ac66835a8390fc78a8 to your computer and use it in GitHub Desktop.
Save Daiver/58ac66835a8390fc78a8 to your computer and use it in GitHub Desktop.
use std::collections::HashMap;
fn process_polish(funcs : &HashMap<&str, Box<(Fn(&mut Vec<f32>) -> f32)>>, token : &str, stack : &mut Vec<f32>)
{
if funcs.contains_key(token) {
let val = funcs[token](stack);
stack.push(val);
}else{
let tmp = token.parse::<f32>();
match tmp{
Ok(f) => stack.push(f),
_ => println!("Bad token")
}
}
}
fn main()
{
let mut funcs : HashMap<&str, Box<(Fn(&mut Vec<f32>) -> f32)> > = HashMap::new();
//let mut funcs = HashMap::new();
funcs.insert("+", Box::new(
|stack : &mut Vec<f32>| stack.pop().unwrap() +
stack.pop().unwrap()));
funcs.insert("-", Box::new(
|stack : &mut Vec<f32>| stack.pop().unwrap() -
stack.pop().unwrap()));
funcs.insert("*", Box::new(
|stack : &mut Vec<f32>| stack.pop().unwrap() *
stack.pop().unwrap()));
funcs.insert("/", Box::new(
|stack : &mut Vec<f32>| stack.pop().unwrap() /
stack.pop().unwrap()));
let mut stack = vec![0.3];
let seq = vec!["1", "2", "+", "7", "*", "8", "/"];
for x in seq{
process_polish(&funcs, x, &mut stack);
}
for x in stack{
println!("{}", x);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment