diff --git a/Cargo.toml b/Cargo.toml index 3160250..6a1886f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,3 +4,5 @@ version = "0.1.0" edition = "2024" [dependencies] +rand = "0.9.0" +paste = "1.0.15" diff --git a/src/instructions/mod.rs b/src/instructions/mod.rs new file mode 100644 index 0000000..4375cad --- /dev/null +++ b/src/instructions/mod.rs @@ -0,0 +1 @@ +pub mod numeric; diff --git a/src/instructions/numeric.rs b/src/instructions/numeric.rs new file mode 100644 index 0000000..5ed34b1 --- /dev/null +++ b/src/instructions/numeric.rs @@ -0,0 +1,39 @@ +//! # Numeric Instructions +//! +//! This file contains numeric instructions for int and float. + +use crate::push::state::*; +use paste::paste; +use std::ops::Add; + +fn _add>(val0: T, val1: T) -> T { + val0 + val1 +} + +#[macro_export] +macro_rules! make_instruction { + ($stack_name:ident, $fn_name:ident) => { + paste::item! { + fn [< $stack_name $fn_name >] (state: &mut PushState) -> Option< { + let val0 = state.$stack_name[0]; + let val1 = state.$stack_name[1]; + $fn_name(val0, val1); + println!("{val0} {val1}"); + } + } + }; +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn add_test() { + let mut test_state = EMPTY_STATE; + test_state.int = vec![1, 2]; + // assert_eq!(vec![1, 2, 3], _add(&mut test_state).int); + make_instruction!(int, _add); + int_add(&mut test_state); + } +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..0effcec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,6 @@ +mod instructions; +mod push; + fn main() { println!("Hello, world!"); } diff --git a/src/push/interpreter.rs b/src/push/interpreter.rs new file mode 100644 index 0000000..c4f65ae --- /dev/null +++ b/src/push/interpreter.rs @@ -0,0 +1,3 @@ +use crate::push::state; + +pub fn interpret_program() {} diff --git a/src/push/mod.rs b/src/push/mod.rs new file mode 100644 index 0000000..7181eca --- /dev/null +++ b/src/push/mod.rs @@ -0,0 +1,2 @@ +pub mod interpreter; +pub mod state; diff --git a/src/push/state.rs b/src/push/state.rs new file mode 100644 index 0000000..6a5a6d4 --- /dev/null +++ b/src/push/state.rs @@ -0,0 +1,26 @@ +#[derive(Debug, Clone)] +pub struct PushState { + pub int: Vec, + pub float: Vec, + pub string: Vec>, + pub bool: Vec, + pub char: Vec, + pub vector_int: Vec>, + pub vector_float: Vec>, + pub vector_string: Vec>>, + pub vector_bool: Vec>, + pub vector_char: Vec, +} + +pub const EMPTY_STATE: PushState = PushState { + int: vec![], + float: vec![], + string: vec![], + bool: vec![], + char: vec![], + vector_int: vec![], + vector_float: vec![], + vector_string: vec![], + vector_bool: vec![], + vector_char: vec![], +};