fn main() { let mut stack = vec![]; stack.push(42); stack.push(36); add(&mut stack); println!("stack: {stack:?}"); } fn add(stack: &mut Vec<i32>){ let lhs = stack.pop().unwrap(); let rhs = stack.pop().unwrap(); stack.push(lhs + rhs); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.23s
Running `target/debug/stackmachine`
stack: [78]
### 標準入力からの読み込み
fn main() { for line in std::io::stdin().lines() { if let Ok(line) = line { let words: Vec<_> = line.split(" ").collect(); println!("Line: {words:?}"); } } }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.82s
Running `target/debug/stackmachine`
42 3 +
Line: [“42”, “3”, “+”]
### 文字列のパースと実行
fn main() { for line in std::io::stdin().lines() { let mut stack = vec![]; if let Ok(line) = line { let words: Vec<_> = line.split(" ").collect(); for word in words { if let Ok(parsed) = word.parse::<i32>() { stack.push(parsed); } else { match word { "+" => add(&mut stack), _ => panic!("{word:?} could not be parsed"), } } } println!("stadk: {stack:?}"); } } } fn add(stack: &mut Vec<i32>){ let lhs = stack.pop().unwrap(); let rhs = stack.pop().unwrap(); stack.push(lhs + rhs); }
### 四則演算
fn main() { for line in std::io::stdin().lines() { let mut stack = vec![]; if let Ok(line) = line { let words: Vec<_> = line.split(" ").collect(); for word in words { if let Ok(parsed) = word.parse::<i32>() { stack.push(parsed); } else { match word { "+" => add(&mut stack), "-" => sub(&mut stack), "*" => mul(&mut stack), "/" => div(&mut stack), _ => panic!("{word:?} could not be parsed"), } } } println!("stadk: {stack:?}"); } } } fn add(stack: &mut Vec<i32>){ let rhs = stack.pop().unwrap(); let lhs = stack.pop().unwrap(); stack.push(lhs + rhs); } fn sub(stack: &mut Vec<i32>){ let rhs = stack.pop().unwrap(); let lhs = stack.pop().unwrap(); stack.push(lhs - rhs); } fn mul(stack: &mut Vec<i32>){ let rhs = stack.pop().unwrap(); let lhs = stack.pop().unwrap(); stack.push(lhs * rhs); } fn div(stack: &mut Vec<i32>){ let rhs = stack.pop().unwrap(); let lhs = stack.pop().unwrap(); stack.push(lhs / rhs); }