1.7 KiB
1.7 KiB
name = "Compute simple Forth expressions" file = "src/vec/compute.rs"
Forth is a stack based programming language based on the Reverse Polish Notation. In this language, a program is expressed as a stream of words, each word representing an instruction. For example, this expression:
1.0 2.0 +
represent a program made of 3 words: 1.0 meaning "push the number 1.0" on the stack, 2.0 meaning push 2.0 on the stack, and + meaning "pop the two highest numbers off the stack, and push their sum". We will first define some types to represent such program, and then implement the compute function, taking a slice of operations and giving the result of computing these operations.
/// Possible operations
pub enum Operation {
Push(f32),
Binary(Binary),
}
/// Different binary operators
pub enum Binary {
/// +
Add,
/// -
Sub,
/// *
Mul,
/// /
Div,
}
/// What could go wrong when computing a Forth expression
#[derive(PartialEq, Debug)]
pub enum ComputeError {
NotEnoughData,
DivisionByZero,
}
pub fn compute(operations: &[Operation]) -> Result<f32, ComputeError> {
unimplemented!()
}
fn main() {
// 1 2 3 * +
// gives the result 7 because it's computed as 1 + 2 * 3
assert_eq!(
compute(&[
Operation::Push(1.0),
Operation::Push(2.0),
Operation::Push(3.0),
Operation::Binary(Binary::Mul),
Operation::Binary(Binary::Add),
]),
Ok(7.0)
);
assert_eq!(compute(&[Operation::Binary(Binary::Add)), Err(ComputeError::NotEnoughData));
}