diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-01-09 16:15:55 +0100 |
|---|---|---|
| committer | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-01-09 16:15:55 +0100 |
| commit | 158c2c284fa61be972dd868e2f262f9e04a0edb4 (patch) | |
| tree | 2a5e26df6993deba75ba9fc91d2784f1623c24a6 /src | |
| parent | 0bd19fbf34dff8b3030fcc243e05e5e894acfff5 (diff) | |
| download | sylt-158c2c284fa61be972dd868e2f262f9e04a0edb4.tar.gz | |
Add, Sub
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 4 | ||||
| -rw-r--r-- | src/vm.rs | 34 |
2 files changed, 37 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs index f407767..72fb8a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,10 @@ fn main() { let mut blocks = vm::Block::new("main"); blocks.add(vm::Op::Constant(vm::Value::Bool(true))); blocks.add(vm::Op::Print); + blocks.add(vm::Op::Constant(vm::Value::Int(123))); + blocks.add(vm::Op::Constant(vm::Value::Int(123))); + blocks.add(vm::Op::Add); + blocks.add(vm::Op::Print); blocks.add(vm::Op::Return); vm::run_block(blocks); @@ -10,6 +10,10 @@ pub enum Value { pub enum Op { Pop, Constant(Value), + Add, + Sub, + Mul, + Div, Print, Return, } @@ -87,8 +91,36 @@ impl VM { self.stack.push(value); } + Op::Add => { + let b = self.stack.pop().unwrap(); + let a = self.stack.pop().unwrap(); + match (a, b) { + (Value::Float(a), Value::Float(b)) => self.stack.push(Value::Float(b + a)), + (Value::Int(a), Value::Int(b)) => self.stack.push(Value::Int(b + a)), + _ => unimplemented!("Cannot add '{:?}' and '{:?}'.", a, b), + } + } + + Op::Sub => { + let b = self.stack.pop().unwrap(); + let a = self.stack.pop().unwrap(); + match (a, b) { + (Value::Float(a), Value::Float(b)) => self.stack.push(Value::Float(b - a)), + (Value::Int(a), Value::Int(b)) => self.stack.push(Value::Int(b - a)), + _ => unimplemented!("Cannot sub '{:?}' and '{:?}'.", a, b), + } + } + + Op::Mul => { + todo!(); + } + + Op::Div => { + todo!(); + } + Op::Print => { - println!("PRINT: {:?}", self.stack[0]); + println!("PRINT: {:?}", self.stack.pop()); } Op::Return => { |
