From 64fad0dff8ab45af376a4a04052169d4f5cc399e Mon Sep 17 00:00:00 2001 From: Rowan Torbitzky-Lane Date: Thu, 3 Apr 2025 15:38:02 -0500 Subject: [PATCH] start of test-driven development/macro done --- src/instructions/mod.rs | 54 +++++++++++++++++++++++++++++++ src/instructions/numeric.rs | 63 +++++++++++++++++++++++++------------ src/instructions/utils.rs | 1 + src/lib.rs | 1 + src/main.rs | 4 ++- src/push/state.rs | 2 +- 6 files changed, 103 insertions(+), 22 deletions(-) create mode 100644 src/instructions/utils.rs create mode 100644 src/lib.rs diff --git a/src/instructions/mod.rs b/src/instructions/mod.rs index 4375cad..be92ad7 100644 --- a/src/instructions/mod.rs +++ b/src/instructions/mod.rs @@ -1 +1,55 @@ +#[macro_use] +pub mod macros { + // A macro that makes a push instruction given: the name of the stack to use, + // an internal function to call, and the type of a function. + #[macro_export] + macro_rules! make_instruction { + ($stack_name:ident, $fn_name:ident, $fn_type:ty) => { + paste::item! { + fn [< $stack_name $fn_name >] (state: &mut PushState, num_inputs: usize) { + if state.$stack_name.len() < num_inputs { + return; + } + let mut inputs: Vec<$fn_type> = Vec::with_capacity(num_inputs); + for n in 0..num_inputs { + inputs.push(state.$stack_name[n]); + } + if let Some(result) = $fn_name(inputs) { + for _ in 0..num_inputs { + state.$stack_name.pop(); + } + state.$stack_name.push(result); + } + } + } + }; + } +} + pub mod numeric; +pub mod utils; + +// /// A macro that makes a push instruction given: the name of the stack to use, +// /// an internal function to call, and the type of a function. +// #[macro_export] +// macro_rules! make_instruction { +// ($stack_name:ident, $fn_name:ident, $fn_type:ty) => { +// paste::item! { +// fn [< $stack_name $fn_name >] (state: &mut PushState, num_inputs: usize) { +// if state.$stack_name.len() < num_inputs { +// return; +// } +// let mut inputs: Vec<$fn_type> = Vec::with_capacity(num_inputs); +// for n in 0..num_inputs { +// inputs.push(state.$stack_name[n]); +// } +// if let Some(result) = $fn_name(inputs) { +// for _ in 0..num_inputs { +// state.$stack_name.pop(); +// } +// state.$stack_name.push(result); +// } +// } +// } +// }; +// } diff --git a/src/instructions/numeric.rs b/src/instructions/numeric.rs index 5ed34b1..b1cad92 100644 --- a/src/instructions/numeric.rs +++ b/src/instructions/numeric.rs @@ -2,38 +2,61 @@ //! //! This file contains numeric instructions for int and float. -use crate::push::state::*; -use paste::paste; -use std::ops::Add; +use crate::push::state::{EMPTY_STATE, PushState}; +use std::ops::{Add, Sub}; -fn _add>(val0: T, val1: T) -> T { - val0 + val1 +/// Adds two addable values together. +fn _add(vals: Vec) -> Option +where + T: Add, + T: Copy, +{ + Some(vals[1] + vals[0]) } -#[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}"); - } - } - }; +/// Subtracts two subtractable values from each other. +fn _sub(vals: Vec) -> Option +where + T: Sub, + T: Copy, +{ + Some(vals[1] - vals[0]) } +/// Declares int_add +make_instruction!(int, _add, i64); + #[cfg(test)] mod tests { use super::*; + /// Tests the _add function. #[test] fn add_test() { + let vals: Vec = vec![1, 2]; + assert_eq!(Some(3), _add(vals)); + + let vals: Vec = vec![1.1, 2.2]; + assert_eq!(Some(3.3), _add(vals)); + } + + /// Tests the _sub function. + #[test] + fn sub_test() { + let vals: Vec = vec![1, 2]; + assert_eq!(Some(1), _sub(vals)); + + let vals: Vec = vec![1.1, 2.2]; + assert_eq!(Some(1.1), _sub(vals)); + } + + // Tests that the various state_add functions work. + #[test] + fn state_add() { 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); + test_state.float = vec![1.1, 2.2]; + int_add(&mut test_state, 2); + assert_eq!(test_state.int, vec![3]); } } diff --git a/src/instructions/utils.rs b/src/instructions/utils.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/instructions/utils.rs @@ -0,0 +1 @@ + diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ + diff --git a/src/main.rs b/src/main.rs index 0effcec..031ce84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,5 +2,7 @@ mod instructions; mod push; fn main() { - println!("Hello, world!"); + let arr: Vec = vec![]; + let slice = &arr[..2]; + println!("{:?}", slice); } diff --git a/src/push/state.rs b/src/push/state.rs index 6a5a6d4..aea2c74 100644 --- a/src/push/state.rs +++ b/src/push/state.rs @@ -1,7 +1,7 @@ #[derive(Debug, Clone)] pub struct PushState { pub int: Vec, - pub float: Vec, + pub float: Vec, pub string: Vec>, pub bool: Vec, pub char: Vec,